AWS IAM Roles Anywhere 및 Private CA를 사용한 Salesforce와 AWS 통합
Source: Dev.to
개요
| 구성 요소 | 목적 |
|---|---|
| Salesforce Certificate & Key Management | AWS에 업로드할 자체 서명 인증서를 생성합니다. |
| AWS Certificate Manager Private CA | 개인 루트 CA가 서명한 인증서를 발급합니다. |
| IAM Roles Anywhere | 개인 CA를 신뢰하도록 설정하고, 신뢰 앵커, 프로파일, 그리고 Salesforce가 사용할 수 있는 역할을 생성합니다. |
| Salesforce External Credential & Named Credential | 위에서 만든 역할을 사용하여 AWS Signature V4 인증을 구성합니다. |
단계별 지침
1️⃣ Salesforce에서 자체 서명 인증서 만들기
- Setup에서 Certificate & Key Management를 검색합니다.
- Create Self‑Signed Certificate를 클릭합니다.
- Label과 고유한 Name을 입력한 뒤 Save합니다.
- 생성된 인증서를
cert.pem파일로 Download하고 안전하게 보관합니다.
2️⃣ AWS ACM‑PCA에서 개인 루트 CA 설정하기
- AWS Certificate Manager (ACM) Private CA 콘솔을 엽니다.
- Create CA → Mode: General‑Purpose → CA Type: Root를 선택합니다.
- 필수 정보를 입력하고 키 알고리즘으로 RSA 2048을 선택합니다.
- 설정을 검토한 뒤 Create CA를 클릭합니다.
생성 후 – Actions 아래에서 Install CA certificate를 선택해 CA를 활성화합니다.
CA 상태가 Pending Certificate → Active로 변경되는지 확인합니다.
3️⃣ 개인 루트 CA로 서명된 인증서 발급하기
# 인증서 발급 (플레이스홀더 교체)
aws acm-pca issue-certificate \
--certificate-authority-arn "" \
--csr fileb://crt.pem \
--signing-algorithm "SHA256WITHRSA" \
--validity Value=365,Type="DAYS" \
--region "us-east-1"
- 명령 출력에서 CertificateArn을 복사합니다.
- 서명된 인증서를 가져옵니다:
aws acm-pca get-certificate \
--certificate-authority-arn "" \
--certificate-arn ""
- 반환된 PEM 내용을
cert.crt파일에 저장합니다.- 헤더/푸터를 제외한 각 줄은 정확히 64자가 되도록 합니다.
-----BEGIN CERTIFICATE-----와-----END CERTIFICATE-----라인을 포함합니다.
4️⃣ 서명된 인증서를 Salesforce에 업로드하기
- Setup → Certificate & Key Management에서 Upload Certificate를 클릭합니다.
- 이전 단계에서 만든
cert.crt파일을 선택하고 Save합니다.
5️⃣ IAM Roles Anywhere에서 트러스트 앵커 만들기
- AWS 콘솔에서 IAM Roles Anywhere를 엽니다.
- Create Trust Anchor를 클릭합니다.
- 이름을 입력하고 2단계에서 만든 Private CA를 선택한 뒤 Create Trust Anchor를 클릭합니다.
6️⃣ 트러스트 정책을 포함한 IAM 역할 만들기
트러스트 정책 (JSON)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "rolesanywhere.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession",
"sts:SetSourceIdentity"
]
}
]
}
- IAM 콘솔에서 새 역할을 만들고 위 트러스트 정책을 붙여넣습니다.
- AmazonConnect_FullAccess 정책(또는 필요한 권한을 가진 사용자 정의 정책)을 연결합니다.
7️⃣ IAM Roles Anywhere에서 프로파일 만들기
- IAM Roles Anywhere에서 Create Profile을 클릭합니다.
- 프로파일 이름을 입력하고 6단계에서 만든 역할을 연결한 뒤 Create Profile를 클릭합니다.
8️⃣ Salesforce 외부 자격 증명 구성하기
- Setup → Named Credentials → External Credentials → New
| 필드 | 값 |
|---|---|
| Label | AWS IAM Anywhere Credential |
| Name | AWS_IAM_Anywhere_Credential |
| Authentication Protocol | AWS Signature V4 |
| Service | sts (나중에 connect 로 변경) |
| Region | us-east-1 |
| AWS Account ID | (선택 사항) |
| Obtain Temporary IAM Credentials via STS | Roles Anywhere |
| Trust Anchor ARN | 5단계에서 얻은 ARN |
| Profile ARN | 7단계에서 얻은 ARN |
| Signing Certificate | 4단계에서 업로드한 인증서와 동일한 파일 |
| STS Duration (seconds) | 3600 |
- 외부 자격 증명을 위한 새 프린시플 생성
| 필드 | 값 |
|---|---|
| Name | connect_principal (예시) |
| ARN | 6단계에서 만든 IAM 역할의 ARN |
| Character set | [a-zA-Z0-9_+=,.@-]* |
- 외부 자격 증명을 Save합니다.
9️⃣ Named Credential 만들기
- Setup → Named Credentials → New Named Credential
| 필드 | 값 |
|---|---|
| Label | Connect API Connection |
| Name | Connect_A (계속 이어지는 이름을 입력하세요) |
| URL | https://connect.amazonaws.com (예시) |
| Identity Type | Named Principal |
| Authentication Protocol | AWS Signature V4 |
| External Credential | 8단계에서 만든 외부 자격 증명 선택 |
| Generate Authorization Header | True |
| Allow Merge Fields in HTTP Header | True |
| Allow Merge Fields in HTTP Body | True |
- 모든 설정을 완료한 뒤 Save합니다.
Source: …
| 항목 | 값 |
|---|---|
| Named Credential | Connect_API_Connection |
| URL | https://sts.us-east-1.amazonaws.com (추후 업데이트 예정) |
| External Credential | 위에서 만든 외부 자격 증명 선택 |
| Generate Authorization Header | 체크됨 |
🔟 프린시플에 권한 부여
- Setup → Permission Sets → New.
- 라벨을 입력 (예:
AWS_RolesAnywhere_Access). - 권한 세트에서 External Credential Principal Access 로 이동한 뒤
connect_principal을 Enabled 열로 이동. - 해당 권한 세트를 적절한 Salesforce 사용자에게 할당.
1️⃣1️⃣ 통합 테스트 (STS 호출)
Developer Console → Execute Anonymous 를 열고 다음 코드를 실행:
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:Connect_API_Connection/?Action=GetCallerIdentity&Version=2011-06-15');
req.setMethod('GET');
Http http = new Http();
HTTPResponse res = http.send(req);
System.debug(res.getBody());
디버그 로그 확인: 200 상태 코드는 STS GetCallerIdentity 호출이 성공했음을 의미합니다.
1️⃣2️⃣ Named Credential을 Amazon Connect로 전환
- Named Credential (
Connect_API_Connection)을 편집. - Service를
sts→connect로 변경. - URL을
https://connect.us-east-1.amazonaws.com로 업데이트.
Connect 호출 테스트
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:Connect_API_Connection/?Action=ListInstances&Version=2017-08-08');
req.setMethod('GET');
Http http = new Http();
HTTPResponse res = http.send(req);
System.debug(res.getBody());
성공적인 응답이 반환되면 Salesforce가 IAM Roles Anywhere를 사용해 Amazon Connect를 호출할 수 있게 된 것입니다.
🎉 All Done!
You now have a certificate‑based, key‑less integration between Salesforce and AWS, leveraging IAM Roles Anywhere and a private CA for secure, temporary credential issuance.
참고 자료
// APN_API_Connection is the name of the named credential
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:Connect_API_Connection/?Action=GetCallerIdentity&Version=2011-06-15');
req.setMethod('GET');
Http http = new Http();
HttpResponse res = http.send(req);
System.debug(res.getBody());
Note: 로그 파일을 열어 상태를 확인하십시오.
성공하면 로그에 200 상태 코드와 반환된 속성들이 표시되어 AWS에서 Amazon Connect API 호출이 성공했음을 나타냅니다.
Amazon Connect와 마찬가지로 HTTP 호출을 지원하는 모든 서비스에 대해 이 방식을 구성할 수 있습니다.