CodePipeline을 미리 제공된 ACL과 함께 사용하여 다른 계정의 Amazon S3에 아티팩트를 배포하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 6월 18일

AWS CodePipeline에서 S3 배포 작업 공급자와 ACL(미리 제공된 액세스 제어 목록)을 사용하여 다른 계정의 Amazon S3(Amazon Simple Storage Service)에 아티팩트를 배포하려고 합니다.

간략한 설명

다음 해결 방법의 예제 시나리오에서는 다음을 가정합니다.

  • 개발(dev)계정과 프로덕션(prod)계정의 계정 2개가 있습니다.
  • dev 계정의 입력 버킷 이름은 codepipeline-input-bucket입니다(버전 관리 활성화됨).
  • dev 계정의 기본 아티팩트 버킷 이름은 codepipeline-us-east-1-0123456789입니다.
  • prod 계정의 출력 버킷 이름은 codepipeline-output-bucket입니다.
  • dev 계정에서 prod 계정의 S3 버킷으로 아티팩트를 배포합니다.
  • 미리 제공된 ACL을 사용하여 prod 계정의 버킷 소유자에게 dev 계정이 소유한 객체에 대한 액세스 권한을 제공합니다. 아티팩트를 배포하고 prod 계정을 객체 소유자로 설정하려면 CodePipeline을 사용하여 다른 계정의 Amazon S3에 아티팩트를 배포하려면 어떻게 해야 합니까?를 참조하십시오.

해결 방법

dev 계정에서 CodePipeline 생성

1.    CodePipeline 콘솔을 열고 [파이프라인 생성]을 선택합니다.

2.    [파이프라인 이름]에 crossaccountdeploy를 입력합니다.

참고: crossaccountdeploy를 파이프라인 이름으로 바꾸십시오.

[역할 이름] 텍스트 상자는 서비스 역할 이름 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy로 자동으로 채워집니다. 기존 서비스 역할을 선택할 수도 있습니다.

3.    [고급 설정] 섹션을 확장합니다.

4.    [아티팩트 스토어]에서 [기본 위치]를 선택합니다.

참고: 시나리오에 필요한 경우 [사용자 지정 위치]를 선택할 수 있습니다.

5.    [암호화 키]에서 [기본 AWS 관리형 키]를 선택합니다.

6.    [다음]을 선택합니다.

7.    [소스 단계 추가] 페이지의 [소스 공급자]에서 Amazon S3를 선택합니다.

8.    [버킷]에 codepipeline-input-bucket을 입력합니다.

참고: codepipeline-input-bucket을 입력 버킷의 이름으로 바꾸십시오.

중요: CodePipeline에서 입력 버킷을 사용하려면 입력 버킷에 버전 관리가 활성화되어 있어야 합니다.

9.    [S3 객체 키]에 sample-website.zip을 입력합니다.

중요: 자체 웹 사이트 대신 예제 AWS 웹 사이트를 사용하려면 자습서: Amazon S3를 배포 공급자로 사용하는 파이프라인 생성을 참조하십시오. 그런 다음 [1: Amazon S3에 정적 웹 사이트 배포] 섹션의 [사전 조건]에서 “샘플 정적 웹 사이트”를 검색합니다.

10.    [변경 탐지 옵션]에서 [Amazon CloudWatch Events(권장)]를 선택합니다.

11.    [다음]을 선택합니다.

12.    [구축 단계 추가] 페이지에서 [구축 단계 건너뛰기]를 선택하고 [건너뛰기]를 선택합니다.

13.    [배포 단계 추가] 페이지의 [배포 공급자]에서 [Amazon S3]를 선택합니다.

14.    [리전]에서 [미국 동부(버지니아 북부)]를 선택합니다.

중요: 미국 동부(버지니아 북부)를 출력 버킷의 AWS 리전으로 바꾸십시오.

15.    [버킷]에 prod 버킷의 이름인 codepipeline-output-bucket을 입력합니다.

참고: codepipeline-output-bucket을 입력 버킷의 이름으로 바꾸십시오.

16.    [배포 전 파일 추출] 확인란을 선택합니다.

참고: 필요한 경우 [배포 경로]에 대한 경로를 입력합니다.

17.    [추가 구성]을 확장합니다.

18.    [미리 제공된 ACL]에서 [bucket-owner-full-control]을 선택합니다.

참고: [bucket-owner-full-control]은 대상 prod 계정의 버킷 소유자에게 dev 계정이 배포하고 소유한 객체에 대한 전체 액세스 권한을 부여합니다. 자세한 정보는 미리 제공된 ACL을 참조하십시오.

19.    [다음]을 선택합니다.

20.    [파이프라인 생성]을 선택합니다.

이제 파이프라인이 트리거되지만 소스 단계는 실패합니다. 이어서 다음 오류가 표시됩니다.

The object with key 'sample-website.zip' does not exist.

[입력 버킷에 샘플 웹 사이트 업로드] 섹션에는 나중에 이 오류를 해결하는 방법이 표시됩니다.

prod 계정의 출력 버킷에 대한 S3 액세스를 추가하는 AWS Identity and Access Management(IAM) 정책으로 CodePipeline 서비스 역할 구성

1.    dev 계정에서 IAM 콘솔을 엽니다.

2.    탐색 창에서 [정책]을 선택하고 [정책 생성]을 선택합니다.

3.    [JSON] 탭을 선택한 다음 JSON 편집기에 다음 정책을 입력합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::codepipeline-output-bucket/*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::codepipeline-output-bucket"
        }
    ]
}

참고: codepipeline-output-bucket을 입력 버킷의 이름으로 바꾸십시오.

4.    [정책 검토]를 선택합니다.

5.    [이름]에 prodbucketaccess를 입력합니다.

참고: prodbucketaccess를 자체 정책 이름으로 바꾸십시오.

6.    [정책 생성]을 선택합니다.

7.    탐색 창에서 [역할]을 선택합니다.

8.    역할 목록에서 AWSCodePipelineServiceRole-us-east-1-crossacountdeploy를 선택합니다. 이는 CodePipeline에서 사용하는 서비스 역할입니다.

참고: 해당하는 경우 AWSCodePipelineServiceRole-us-east-1-crossacountdeploy를 서비스 역할로 바꾸십시오.

9.    [정책 연결]을 선택합니다.

10.    앞서 생성한 [prodbucketaccess] 정책을 선택한 다음 [정책 연결]을 선택합니다.

이제 CodePipeline은 prod 계정의 출력 버킷에 액세스할 수 있습니다.

dev 계정에서의 액세스를 허용하도록 prod 계정의 출력 버킷 구성

1.    prod 계정에서 Amazon S3 콘솔을 엽니다.

2.    [버킷 이름] 목록에서 [codepipeline-output-bucket]을 선택합니다.

참고: codepipeline-output-bucket을 입력 버킷의 이름으로 바꾸십시오.

3.    [Permissions(권한)]을 선택한 다음, [Bucket Policy(버킷 정책)]을 선택합니다.

4.    텍스트 편집기에서 다음 정책을 입력합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::dev-account-id:root"
            },
            "Action": "s3:Put*",
            "Resource": "arn:aws:s3:::codepipeline-output-bucket/*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::dev-account-id:root"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::codepipeline-output-bucket"
        }
    ]
}

참고: dev-account-id를 dev 환경의 계정 ID로 바꾸십시오. codepipeline-output-bucket을 출력 버킷 이름으로 바꾸십시오.

5.    [저장]을 선택합니다.

입력 버킷에 샘플 웹 사이트 업로드

1.    dev 계정에서 Amazon S3 콘솔을 엽니다.

2.    [버킷 이름 목록]에서 codepipeline-input-bucket을 선택합니다.

참고: codepipeline-input-bucket을 입력 버킷의 이름으로 바꾸십시오.

3.    [업로드]를 선택한 다음 [파일 추가]를 선택합니다.

4.    앞서 다운로드한 sample-website.zip 파일을 선택합니다.

5.    [업로드]를 선택합니다.

이제 CodePipeline이 트리거되고 다음이 수행됩니다.

1.    소스 작업은 codepipeline-input-bucket에서 sample-website.zip을 선택한 다음 이 zip 파일을 codepipeline-us-east-1-0123456789 아티팩트 버킷 내에 소스 아티팩트로 배치합니다.

2.    배포 작업에서 CodePipeline 서비스 역할 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy는 액세스 권한을 사용하여 prod 계정의 codepipeline-output-bucket에 배포하고 미리 제공된 ACL bucket-owner-full-control을 적용합니다.

이제 dev 계정은 codepipeline-output-bucket에서 추출된 객체의 소유자가 되지만, prod 계정의 버킷 소유자도 배포된 아티팩트에 대한 모든 액세스 권한을 가집니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?