교차 계정 CodeCommit 리포지토리를 사용하여 CodePipeline 소스 단계를 구성하려면 어떻게 해야 하나요?
교차 계정 AWS CodeCommit 리포지토리를 사용하여 AWS CodePipeline 소스 단계를 구성하려고 합니다.
해결 방법
참고: CodeCommit은 신규 고객에게 제공되지 않습니다. 기존 CodeCommit 고객은 이 서비스를 계속 사용할 수 있습니다. 자세한 내용은 AWS CodeCommit 리포지토리를 다른 Git 공급자로 마이그레이션하는 방법을 참조하세요.
다음 해결 방법은 CodeCommit 리포지토리에 계정 A를 사용하고 CodePipeline에 계정 B를 사용합니다.
계정 A에 CodeCommit 리포지토리 생성
계정 A에 CodeCommit 리포지토리를 생성하려면 AWS CodeCommit 리포지토리 생성을 참조하세요.
계정 A에서 교차 계정 역할 구성
다음 단계를 완료하세요.
- 계정 A에서 AWS Identity and Access Management(AWS IAM) 콘솔을 엽니다.
- 탐색 창에서 역할을 선택합니다.
- 새 역할 생성을 선택한 후 다음 단계를 완료합니다.
AWS 계정을 신뢰할 수 있는 개체 유형으로 선택합니다.
다른 AWS 계정을 선택한 다음 계정 B의 ID를 입력합니다.
IAM 역할의 이름(예: cross-account-access-role)을 입력합니다. - 다음 신뢰 정책을 사용하여 IAM 역할을 생성합니다.
참고: example-account-b를 계정 B ID로 바꿉니다.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::example-account-b:root" }, "Action": "sts:AssumeRole", "Condition": {} } ] }
계정 B의 CodePipeline과 함께 사용할 AWS KMS 키 생성
참고: 교차 계정 배포에는 AWS Key Management Service(AWS KMS) 고객 관리형 키를 사용해야 합니다. 키를 구성하지 않으면 CodePipeline이 기본 암호화로 개체를 암호화하며 대상 계정 역할은 개체를 해독할 수 없습니다.
다음 단계를 완료하세요.
- 계정 B에서 AWS KMS 콘솔을 엽니다.
- 탐색 창에서 고객 관리 키를 선택하고 다음 단계를 완료합니다.
Key type(키 유형)에서 Symmetric(대칭)을 선택합니다.
키 사용에 대해 암호화 및 해독을 선택합니다. - 고급 옵션을 확장한 후 다음 단계를 완료합니다.
키 자료 오리진으로 KMS를 선택합니다.
별칭에 키의 별칭(예: cmk-key)을 입력합니다.
키 관리자에서 키 관리자에게 액세스 권한을 부여할 IAM ID를 선택합니다. - 기타 AWS 계정 섹션에서 다른 AWS 계정 추가를 선택합니다.
- 계정 A의 ID를 입력합니다.
- 완료를 선택합니다.
계정 B에 CodePipeline 생성
다음 단계를 완료하세요.
- CodePipeline 콘솔을 엽니다.
- 파이프라인 생성을 선택한 다음 파이프라인 이름(예: account\_B\_pipeline)을 지정합니다.
참고: 역할 이름 텍스트 상자는 AWSCodePipelineServiceRole-ap-southeast-2-account\_B\_pipeline 서비스 역할 이름으로 자동으로 채워집니다. AWS KMS 키에 액세스할 수 있는 기존 서비스 역할을 선택할 수도 있습니다. - 고급 설정을 확장한 후 다음 단계를 완료합니다.
아티팩트 저장소의 경우 기본 위치를 선택합니다. 필요한 경우 사용자 지정 위치를 선택할 수 있습니다.
암호화 키에서 고객 관리 키를 선택한 다음 드롭다운 목록에서 cmk-key를 선택합니다.
소스 공급자의 경우 CodeCommit을 선택합니다.
리포지토리 이름에 리포지토리 이름(예: 브랜치 이름을 main으로 하는 account-a-repository)을 입력합니다. - 빌드 단계 추가 페이지에서 빌드 단계 건너뛰기를 선택한 다음 건너뛰기를 선택합니다.
- 배포 단계 추가 페이지에서 배포 공급자에 대해 서비스를 선택합니다.
- 다음을 선택하여 파이프라인을 생성합니다.
참고: 파이프라인을 생성한 후 다음 오류 메시지가 표시되면 이 해결 방법의 교차 계정 역할을 사용하도록 파이프라인 업데이트 섹션을 참조하세요.
오류 메시지:
"account-a-repository라는 이름의 AWS CodeCommit 리포지토리를 찾지 못했기 때문에 작업이 실패했습니다. 리포지토리 이름이 올바른지 확인한 다음 다시 시도하세요. 오류: account-a-repository"
계정 B의 AWS KMS 사용 정책 업데이트
다음 단계를 완료하세요.
- 계정 B에서 AWS KMS 콘솔을 엽니다.
- 탐색 창에서 고객 관리 키를 선택합니다.
- 표에서 키의 별칭(예: cmk-key)을 선택합니다.
- 키 사용자 섹션에서 추가를 선택합니다.
- 파이프라인 서비스 역할을 입력합니다(예: AWSCodePipelineServiceRole-ap-southeast-2-account\_B\_pipeline).
- AWS KMS 키 정책에 파이프라인 서비스 역할을 추가합니다. 다음은 키 정책의 예입니다.
{ "Id": "key-consolepolicy-3", "Version": "2012-10-17", "Statement": [{ "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::example-account-b:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::example-account-b:role/example-service-role/AWSCodePipelineServiceRole-ap-southeast-2-account_B_pipeline", "arn:aws:iam::<Account_A>:root"] }, "Action": ["kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey"], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::example-account-b>:role/example-service-role/AWSCodePipelineServiceRole-ap-southeast-2-Account_B_pipeline", "arn:aws:iam::example-account-a:root"] }, "Action": ["kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant"], "Resource": "*", "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }] }
계정 B에서 역할 수임 정책 설정
다음 단계를 완료하세요.
-
계정 B에서 IAM 콘솔을 엽니다.
-
탐색 창에서 역할을 선택한 다음 파이프라인 역할을 선택합니다.
-
계정 A의 역할을 맡는 파이프라인 역할에 다음 정책을 추가합니다.
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::example-account-a:example-pipeline-role/*" ] } }참고: 예-계정-A를 계정 A로, example-pipeline-role을 파이프라인 역할로 바꿉니다.
계정 B의 CodePipeline 아티팩트 버킷에 대한 버킷 정책 업데이트
다음 단계를 완료하세요.
-
계정 B에서 Amazon Simple Storage Service(Amazon S3) 콘솔을 엽니다.
-
탐색 창에서 버킷을 선택한 다음 파이프라인 버킷을 선택합니다.
-
권한을 선택한 다음 버킷 정책을 선택합니다.
-
텍스트 편집기에서 다음 정책 문을 포함하도록 정책을 업데이트합니다.
{ "Version": "2012-10-17", "Id": "example-policy-id", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::example-account-a-id:root", "arn:aws:iam::example-account-b-id:root"] }, "Action": [ "s3:Get*", "s3:Put*" ], "Resource": "arn:aws:s3:::example-pipeline-bucket/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::example-account-a-id:root", "arn:aws:iam::example-account-b-id:root"] }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::example-pipeline-bucket" } ] }참고: JSON 형식에 맞게 정렬하려면 기존 문 뒤에 쉼표를 추가하세요. example-policy-id를 정책 ID로, example-account-a-id를 계정 A의 ID로, example-account-b-id를 계정 B의 ID로, example-pipeline-bucket을 파이프라인 버킷 이름으로 바꿉니다.
계정 A에 대한 인라인 IAM 정책을 생성하여 계정 B에 AWS KMS 키를 사용할 권한 부여
다음 단계를 완료하세요.
- 계정 A에서 IAM 콘솔을 엽니다.
- 탐색 창에서 역할을 선택한 다음 cross-account-access-role을 선택합니다.
- 인라인 정책 생성을 선택합니다.
- JSON 탭에서 다음 정책을 입력합니다.
참고: example-account-b-id를 계정 B의 ID로, example-key-id를 AWS KMS 키 ARN으로, example-pipeline-artifact-bucket-arn을 파이프라인 아티팩트 버킷 ARN으로 바꿉니다.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:ap-southeast-2:example-account-b-id:key/example-key-id" ] }, { "Effect": "Allow", "Action": [ "s3:Put*" ], "Resource": [ "arn:aws:s3:::example-pipeline-artifact-bucket-arn/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::example-pipeline-artifact-bucket-arn" ] } ] } - 정책 검토를 선택한 다음 정책을 생성합니다.
교차 계정 역할을 사용하도록 파이프라인 업데이트
참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.
다음 단계를 완료하세요.
-
codepipeline.json이라는 파일에서 파이프라인 정의를 검색하려면 get-pipeline 명령을 실행합니다.
aws codepipeline get-pipeline --name example-account-b-pipeline > codepipeline.json참고: example-account-b-pipeline을 계정 B의 파이프라인 이름으로 바꿉니다.
-
codepipeline.json 파일의 소스 단계에 cross-account IAM 역할 ARN을 추가합니다.
{ "name": "Source", "actions": [ { "name": "Source", "actionTypeId": { "category": "Source", "owner": "AWS", "provider": "CodeCommit", "version": "1" }, "runOrder": 1, "roleArn": "arn:aws:iam::example-account-a-id:role/example-cross-account-access-role", "configuration": { "BranchName": "main", "OutputArtifactFormat": "CODE_ZIP", "PollForSourceChanges": "false", "RepositoryName": "example-account-a-repository" }, "outputArtifacts": [ { "name": "SourceArtifact" } ], "inputArtifacts": [], "region": "example-region", "namespace": "SourceVariables" } ] }참고: example-account-a-id를 계정 A의 ID로, example-cross-account-access-role을 cross-account 역할로, example-account-a-repository를 계정 A의 리포지토리로, example-region을 AWS 리전으로 바꿉니다.
-
codepipeline.json 파일 끝에 있는 메타데이터 섹션을 제거합니다. 또한 메타데이터 섹션 앞에 있는 쉼표를 제거합니다.
예시:"metadata": { "pipelineArn": "arn:aws:codepipeline:ap-southeast-2:12345678912:Account_B_pipeline", "created": "2023-01-11T05:09:20.235000+00:00", "updated": "2023-01-11T17:34:37.294000+00:00" } -
파이프라인을 업데이트하려면 update-pipeline 명령을 실행합니다.
aws codepipeline update-pipeline --cli-input-json example-codepipeline.json참고: example-codepipeline.json을 파이프라인 JSON 파일로 바꿉니다.
참고: 위의 해결 방법을 사용하여 다른 AWS 계정의 CodeCommit 또는 Amazon S3를 다른 AWS 서비스에 사용할 수도 있습니다. 이를 위해서는 파이프라인 단계의 AWS 서비스를 다른 계정의 소스 단계와 통합해야 합니다. 자세한 내용은 CodePipeline에서 다른 AWS 계정의 리소스를 사용하는 파이프라인 생성을 참조하세요.
- 언어
- 한국어
