CodePipeline을 사용하여 다른 계정의 Amazon S3에 아티팩트를 배포하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 10월 20일

AWS CodePipeline에서 S3 배포 작업 공급자를 사용하여 다른 계정의 Amazon Simple Storage Service(Amazon S3)에 아티팩트를 배포하려고 합니다. 또한 아티팩트의 소유자를 대상 계정으로 설정하려고 합니다.

간략한 설명

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

  • 개발(dev)계정과 프로덕션(prod)계정의 계정 2개가 있습니다.
  • dev 계정의 입력 버킷 이름은 codepipeline-input-bucket입니다(버전 관리 활성화됨).
  • dev 계정의 기본 아티팩트 버킷 이름은 codepipeline-us-east-1-0123456789입니다.
  • prod 계정의 출력 버킷 이름은 codepipeline-output-bucket입니다.
  • dev 계정의 아티팩트를 prod 계정의 S3 버킷에 배포합니다.
  • prod 계정에 생성된 교차 계정 역할을 수임한 다음 아티팩트를 배포하려고 합니다. 이 역할은 아티팩트의 객체 소유자를 dev 계정 대신 대상 prod 계정으로 설정합니다.

해결 방법

dev 계정에서 CodePipeline과 함께 사용할 AWS Key Management Service(AWS KMS) 키 생성

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

2.    탐색 창에서 고객 관리형 키를 선택합니다.

3.    [키 생성]을 선택합니다.

4.    [키 유형]에서 [대칭 키]를 선택합니다.

5.    [고급 옵션]을 확장합니다.

6.    [키 자료 오리진]에서 [KMS]를 선택하고 [다음]을 선택합니다.

7.    [별칭]에 s3deploykey를 입력합니다.

참고: s3deploykey를 키 별칭으로 바꿉니다.

8.    [다음(Next)]을 선택합니다.

9.    [키 관리 권한 정의] 페이지의 [키 관리자] 섹션에서 AWS Identity and Access Management(IAM) 사용자 또는 역할을 키 관리자로 선택하고 [다음(Next)]을 선택합니다.

10.    키 사용 권한 정의 페이지의 [다른 AWS 계정] 섹션에서 [다른 AWS 계정 추가]를 선택합니다.

11.    표시되는 텍스트 상자에 prod 계정의 계정 ID를 추가하고 [다음(Next)]을 선택합니다.

참고: [이 계정] 섹션에서 기존 서비스 역할을 선택하고 [dev 계정에서 KMS 사용 정책 업데이트] 섹션의 단계를 건너뛰어도 됩니다.

12.    키 정책을 검토한 다음 [마침(Finish)]을 선택합니다.

중요: 교차 계정 배포에는 KMS 고객 관리형 키를 사용해야 합니다. 키가 구성되지 않은 경우 CodePipeline은 기본 암호화로 객체를 암호화합니다. 이 암호화는 대상 계정의 역할로 복호화할 수 없습니다.

dev 계정에서 CodePipeline 생성

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

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

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

[역할 이름] 텍스트 상자가 서비스 역할 이름 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy로 자동으로 채워됩니다. KMS 키에 대한 액세스 권한이 있는 기존 서비스 역할을 선택해도 됩니다.

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

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

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

5.    [암호화 키]에서 [고객 관리형 키]를 선택합니다.

6.    [KMS 고객 마스터 키]에서 목록의 s3deploykey를 선택하고 [다음(Next)]을 선택합니다.

중요: s3deploykey를 키 별칭으로 바꾸십시오.

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.    [구축 단계 추가] 페이지에서 [구축 단계 건너뛰기(Skip build stage)]를 선택하고 [건너뛰기(Skip)]를 선택합니다.

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

13.    [리전]에서 [미국 동부(버지니아 북부)(US East (N. Virginia))]를 선택합니다.

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

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

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

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

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

16.    [다음(Next)]을 선택합니다.

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

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

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

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

dev 계정에서 KMS 사용 정책 업데이트

중요: 기존 CodePipeline 서비스 역할을 사용하고 있고 dev 계정 섹션에서 CodePipeline과 함께 사용할 AWS Key Management Service(AWS KMS) 키 생성에서 해당 역할을 키 사용자로 이미 추가한 경우 이 섹션을 건너뜁니다.

1.    dev 계정에서 AWS KMS 콘솔을 열고 s3deploykey를 선택합니다.

중요: s3deploykey를 키 별칭으로 바꾸십시오.

2.    [키 사용자(Key users)] 섹션에서 [추가(Add)]를 선택합니다.

3.    검색 상자에 서비스 역할 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy를 입력한 다음 [추가(Add)]를 선택합니다.

프로덕션 계정에서 교차 계정 역할 구성

정책을 생성하려면 다음을 수행합니다.

1.    prod 계정에서 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을 prod 계정의 출력 버킷 이름으로 바꾸십시오.

4.    [정책 검토(Review policy)]를 선택합니다.

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

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

7.    다른 정책을 생성하려면 [정책 생성]을 선택합니다.

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

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey",
                "kms:GenerateDataKey*",
                "kms:Encrypt",
                "kms:ReEncrypt*",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:us-east-1:<dev-account-id>:key/<key id>"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*"
            ],
            "Resource": [
                "arn:aws:s3:::codepipeline-us-east-1-0123456789/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::codepipeline-us-east-1-0123456789"
            ]
        }
    ]
}

참고: 생성한 KMS 키의 ARN을 바꾸십시오. codepipeline-us-east-1-0123456789를 dev 계정의 아티팩트 버킷 이름으로 바꿉니다.

9.    [정책 검토(Review policy)]를 선택합니다.

10.    [이름]에 devkmss3access를 입력합니다.

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

역할을 생성하려면 다음을 수행합니다.

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

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

3.    [다른 AWS 계정]을 선택합니다.

4.    [계정 ID]에 dev 계정 ID를 입력합니다.

5.    [다음: 권한]을 선택합니다.

6.    정책 목록에서 outputbucketfullaccessdevkmss3access를 선택합니다.

7.    [다음: 태그]를 선택합니다.

8.    (선택 사항) 태그를 추가한 후 [다음: 검토]를 선택합니다.

9.    [역할 이름]에 prods3role을 입력합니다.

10.    [역할 생성]을 선택합니다.

11.    역할 목록에서 prods3role을 선택합니다.

12.    [신뢰 관계] 탭을 선택하고 [신뢰 관계 편집]을 선택합니다.

13.    [정책 문서] 편집기에 다음 정책을 입력합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
        "Effect": "Allow",
        "Principal": {
            "AWS": [
            "arn:aws:iam::<dev-account-id>:role/service-role/AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy"
            ]
        },
        "Action": "sts:AssumeRole",
        "Condition": {}
        }
    ]
}

참고: dev-account-id를 dev 환경의 계정 ID와 파이프라인의 서비스 역할로 바꾸십시오.

14.    [신뢰 정책 업데이트(Update Trust Policy)]를 선택합니다.

dev 계정에서 CodePipeline 아티팩트 버킷 및 서비스 역할 구성

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

2.    [버킷 이름 목록]에서 codepipeline-us-east-1-0123456789를 선택합니다.

참고: codepipeline-us-east-1-0123456789를 아티팩트 버킷의 이름으로 바꾸십시오.

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

4.    텍스트 편집기에서 다음 문을 사용하여 기존 정책을 업데이트합니다.

{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<prod-account-id>:root"
    },
    "Action": [
        "s3:Get*",
        "s3:Put*"
    ],
    "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789/*"
},
{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<prod-account-id>:root"
    },
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789"
}

중요: 적절한 JSON 형식에 맞추려면 기존 문 뒤에 쉼표를 추가합니다.

참고: prod-account-id를 prod 환경의 계정 ID로 바꾸십시오. codepipeline-us-east-1-0123456789를 아티팩트 버킷 이름으로 바꾸십시오.

5.    [Save]를 선택합니다.

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

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

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

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": [
            "arn:aws:iam::<prod-account-id>:role/prods3role" 
        ]
    }   
}

참고: prod-account-id를 prod 환경의 계정 ID로 바꾸십시오.

9.    [정책 검토(Review policy)]를 선택합니다.

10.    [이름]에 assumeprods3role을 입력합니다.

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

12.    탐색 창에서 [역할]을 선택한 다음 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy를 선택합니다.

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

13.    [정책 연결(Attach Policies)]을 선택한 다음 assumeprods3role을 선택합니다.

14.    정책 연결(Attach Policy)을 선택합니다.

dev 계정에서 교차 계정 역할을 사용하도록 CodePipeline 업데이트

1.    파이프라인 정의를 codepipeline.json 파일로 가져오려면 다음 명령을 실행합니다.

aws codepipeline get-pipeline --name crossaccountdeploy > codepipeline.json

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

2.    roleArn을 포함하도록 codepipeline.json의 배포 섹션을 업데이트합니다. 예를 들면 다음과 같습니다.

"roleArn": "arn:aws:iam::your-prod-account id:role/prods3role",

roleArn을 추가하려면 다음과 같이 업데이트합니다.

{
    "name": "Deploy",
    "actions": [
        {
            "name": "Deploy",
            "actionTypeId": {
                "category": "Deploy",
                "owner": "AWS",
                "provider": "S3",
                "version": "1"
            },
            "runOrder": 1,
            "configuration": {
                "BucketName": "codepipeline-output-bucket",
                "Extract": "true"
            },
            "outputArtifacts": [],
            "inputArtifacts": [
                {
                    "name": "SourceArtifact"
                }
            ],
            "roleArn": "arn:aws:iam::<prod-account-id>:role/prods3role",
            "region": "us-east-1",
            "namespace": "DeployVariables"
        }
    ]
}

참고: prod-account-id를 prod 환경의 계정 ID로 바꾸십시오.

3.    codepipeline.json 파일의 끝에서 메타데이터 섹션을 제거합니다. 예를 들면 다음과 같습니다.

"metadata": {
    "pipelineArn": "arn:aws:codepipeline:us-east-1:<dev-account-id>:crossaccountdeploy",
    "created": 1587527378.629,
    "updated": 1587534327.983
}

중요: 올바른 JSON 형식에 맞추려면 메타데이터 섹션 앞의 쉼표를 제거합니다.

4.    파이프라인을 업데이트하려면 다음 명령을 실행합니다.

aws codepipeline update-pipeline --cli-input-json file://codepipeline.json

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

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을 선택합니다. 그런 다음, 소스 작업은 웹 사이트를 codepipeline-us-east-1-0123456789 아티팩트 버킷 내부에 소스 아티팩트로 배치합니다.

2.    배포 작업에서 CodePipeline 서비스 역할 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy는 prod 계정의 prods3role을 수임합니다.

3.    CodePipeline은 dev 계정의 KMS 키와 아티팩트 버킷에 대한 prods3role 액세스 권한을 사용하여 아티팩트를 가져옵니다. 그런 다음, CodePipeline은 추출된 파일을 prod 계정의 codepipeline-output-bucket에 배포합니다.

이제 codepipeline-output-bucket의 추출된 객체는 prod 계정의 소유가 됩니다.</p


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


결제 또는 기술 지원이 필요합니까?