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

최종 업데이트 날짜: 2022년 2월 14일

다른 계정의 Amazon Simple Storage Service(Amazon S3) 버킷에 아티팩트를 배포하려고 합니다. 또한, 대상 계정을 객체 소유자로 설정하려고 합니다. AWS CodePipeline을 Amazon S3 배포 작업 공급자로 사용해 이 작업을 수행하는 방법이 있습니까?

해결 방법

참고: 다음 예제 절차에서는 다음을 가정합니다.

  • 두 개의 계정이 있습니다. 하나는 개발 계정, 다른 하나는 프로덕션 계정입니다.
  • 개발 계정의 입력 버킷 이름은 codepipeline-input-bucket입니다(버전 관리가 활성화된 상태).
  • 개발 계정의 기본 아티팩트 버킷 이름은 codepipeline-us-east-1-0123456789입니다.
  • 프로덕션 계정의 출력 버킷 이름은 codepipeline-output-bucket입니다.
  • 개발 계정의 아티팩트를 프로덕션 계정의 S3 버킷에 배포하고자 합니다.
  • 아티팩트를 배포하기 위해 프로덕션 계정에 생성된 교차 계정 역할을 수임합니다. 이 역할은 개발 계정 대신 프로덕션 계정을 객체 소유자로 설정합니다. 프로덕션 계정의 버킷 소유자에게 개발 계정이 소유한 객체에 대한 액세스 권한을 제공하려면 CodePipeline과 미리 제공된 ACL을 사용해 여러 AWS 계정의 Amazon S3에 아티팩트를 배포하려면 어떻게 해야 합니까? 문서를 참조하세요.

개발 계정에서 CodePipeline을 함께 사용하여 AWS KMS 키 생성

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

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

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

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

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

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

6.    키 자료 오리진(Key material origin)에서 KMS를 선택합니다. 그리고 다음(Next)을 선택합니다.

7.    별칭(Alias)으로 사용자의 키 별칭을 입력합니다. 예: s3deploykey.

8.    다음(Next)을 선택합니다. 키 관리 권한 정의(Define key administrative permissions) 페이지가 열립니다.

9.    키 관리자(Key administrators) 섹션에서 AWS Identity and Access Management(IAM) 사용자 또는 역할을 키 관리자로 선택합니다.

10. 다음(Next)을 선택합니다. 키 사용 권한 정의(Define key usage permissions) 페이지가 열립니다.

11.    다른 AWS 계정(Other AWS accounts) 섹션에서 다른 AWS 계정 추가(Add another AWS account)를 선택합니다.

12.    표시되는 텍스트 상자에 프로덕션 계정의 계정 ID를 추가합니다. 그리고 다음(Next)을 선택합니다.

참고: 이 계정(This Account) 섹션에서 기존 서비스 역할을 선택할 수도 있습니다. 기존 서비스 역할을 선택하는 경우 개발 계정에서 KMS 사용 정책 업데이트 섹션의 단계를 건너뜁니다.

13.    키 정책을 검토합니다. 그리고 마침(Finish)을 선택합니다.

개발 계정에서 CodePipeline 생성

1.    CodePipeline 콘솔을 엽니다. 그런 다음, 파이프라인 생성(Create pipeline)을 선택합니다.

2.    파이프라인 이름(Pipeline name)에 파이프라인의 이름을 입력합니다. 예를 들면 crossaccountdeploy입니다.

참고: 역할 이름(Role name) 텍스트 상자는 서비스 역할 이름 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy로 자동으로 채워져 있습니다. KMS 키에 대한 액세스 권한이 있는 다른 기존 서비스 역할을 선택할 수도 있습니다.

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

4.    아티팩트 스토어(Artifact store)에서 기본 위치(Default location)를 선택합니다.
참고: 사용 사례에 필요한 경우 사용자 지정 위치(Custom location)를 선택할 수 있습니다.

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

6.    KMS 고객 관리형 키(KMS customer managed key)의 경우 목록에서 키 별칭(이 예제에서 s3deploykey)을 선택합니다. 그리고 다음(Next)을 선택합니다. 소스 스테이지 추가(Add source stage) 페이지가 열립니다.

7. 소스 공급자(Source provider)에서 Amazon S3를 선택합니다.

8.    버킷(Bucket)에는 개발 입력 S3 버킷의 이름을 입력합니다. 예를 들면 codepipeline-input-bucket입니다.

중요: 입력 버킷에서 버전 관리를 활성화해야 CodePipeline과 함께 사용할 수 있습니다.

9.    S3 객체 키(S3 object key)sample-website.zip을 입력합니다.

중요: 자체 웹 사이트 대신 샘플 AWS 웹 사이트를 사용하려면 자습서: Amazon S3를 배포 공급자로 사용하는 파이프라인 생성을 참조하세요. 그리고 1: Amazon S3에 정적 웹 사이트 배포 섹션의 사전 조건에서 "샘플 정적 웹 사이트"를 검색합니다.

10.    변경 탐지 옵션(Change detection options)에서 Amazon CloudWatch Events(권장)(Amazon CloudWatch Events (recommended))를 선택합니다. 그리고 다음(Next)을 선택합니다.

11.    구축 단계 추가(Add build stage) 페이지에서 구축 단계 건너뛰기(Skip build stage)를 선택합니다. 그리고 건너뛰기(Skip)를 선택합니다.

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

13.    리전(Region)에 프로덕션 출력 S3 버킷이 있는 AWS 리전을 선택합니다. 예: 미국 동부(버지니아 북부)(US East (N. Virginia)).

중요: 프로덕션 출력 버킷의 리전이 파이프라인의 리전과 다른 경우 다음 사항도 확인해야 합니다.

  • 여러 복제본과 함께 AWS KMS 다중 리전 키를 사용합니다.
  • 파이프라인에는 두 리전 모두에 아티팩트 스토어가 있습니다.

14.    버킷(Bucket)에 프로덕션 출력 S3 버킷 이름을 입력합니다. 예: codepipeline-output-bucket.

15.    배포 전 파일 추출(Extract file before deploy) 확인란을 선택합니다.
참고: 필요한 경우 배포 경로(Deployment path)에 대한 경로를 입력합니다.

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

17.    파이프라인 생성(Create pipeline)을 선택합니다. 파이프라인이 실행되지만, 소스 단계가 실패합니다. 다음과 같은 오류 "The object with key 'sample-website.zip' does not exist(‘sample-website.zip’ 키를 포함한 객체가 존재하지 않습니다)."가 표시됩니다.

이 문서의 입력 버킷에 샘플 웹 사이트 업로드 섹션에서 이 오류를 해결하는 방법을 설명합니다.

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

중요: 기존 CodePipeline 서비스 역할을 사용하는 경우 이 섹션을 건너뜁니다.

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

2.    키 별칭(이 예제에서 s3deploykey)을 선택합니다.

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

4.    검색 상자에 서비스 역할 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy를 입력합니다.

5.    추가(Add)를 선택합니다.

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

프로덕션 출력 S3 버킷에 Amazon S3 권한을 부여하는 역할에 대한 IAM 정책 생성

1.    프로덕션 계정에서 IAM 콘솔을 엽니다.

2.    탐색 창에서 정책(Policies)을 선택합니다. 그런 다음, 정책 생성(Create Policy)을 선택합니다.

3.    JSON 탭을 선택합니다. 그리고 다음 정책을 JSON 편집기에 입력합니다.

중요: codepipeline-output-bucket을 프로덕션 출력 S3 버킷 이름으로 바꿉니다.

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

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

5.    이름(Name)에 정책 이름을 입력합니다. 예: outputbucketdeployaccess.

6.    정책 생성(Create policy)을 선택합니다.

필요한 KMS 권한을 부여하는 역할에 대한 IAM 정책 생성

1.    IAM 콘솔에서 정책 생성(Create policy)을 선택합니다.

2.    JSON 탭을 선택합니다. 그리고 다음 정책을 JSON 편집기에 입력합니다.

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

{
  "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"
      ]
    }
  ]
}

3.    정책 검토(Review policy)를 선택합니다.

4.    이름(Name)에 정책 이름을 입력합니다. 예: devkmss3access.

5.    정책 생성(Create policy)을 선택합니다.

개발 계정이 아티팩트를 배포하기 위해 수임할 수 있는 교차 계정 역할 생성

1.    프로덕션 계정에서 IAM 콘솔을 엽니다.

2.    탐색 창에서 역할(Roles)을 선택합니다. 그리고 역할 생성(Create role)을 선택합니다.

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

4.    계정 ID(Account ID)에 개발 계정의 AWS 계정 ID를 입력합니다.

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

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

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

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

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

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

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

12.    신뢰 관계(Trust Relationship)를 선택합니다. 그리고 신뢰 관계 편집(Edit trust relationship)을 선택합니다.

13.    정책 문서(Policy Document) 편집기에 다음 정책을 입력합니다.

중요: dev-account-id를 개발 계정의 AWS 계정 ID로 바꿉니다. AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy를 파이프라인의 서비스 역할 이름으로 바꿉니다.

{
  "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": {}
    }
  ]
}

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

개발 계정의 CodePipeline 아티팩트 버킷에 대한 버킷 정책 업데이트

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

2.    버킷 이름(Bucket name) 목록에서 개발 계정의 아티팩트 버킷 이름(이 예제에서 codepipeline-us-east-1-0123456789)을 선택합니다.

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

4.    텍스트 편집기에서 다음 정책 문을 포함하도록 기존 정책을 업데이트합니다.

중요: 적절한 JSON 형식에 맞추려면 기존 문 뒤에 쉼표를 추가합니다. prod-account-id를 프로덕션 계정의 AWS 계정 ID로 바꿉니다. codepipeline-us-east-1-0123456789를 아티팩트 버킷 이름으로 바꿉니다.

{
    "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"
}

5.    저장(Save)을 선택합니다.

개발 계정의 CodePipeline 서비스 역할에 사용자가 생성한 교차 계정 역할을 수임할 수 있는 정책을 연결합니다.

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

2.    탐색 창에서 정책(Policies)을 선택합니다. 그런 다음, 정책 생성(Create Policy)을 선택합니다.

3.    JSON 탭을 선택합니다. 그리고 다음 정책을 JSON 편집기에 입력합니다.

중요: prod-account-id를 프로덕션 계정의 AWS 계정 ID로 바꿉니다.

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

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

5.    이름(Name)assumeprods3role을 입력합니다.

6.    정책 생성(Create policy)을 선택합니다.

7.    탐색 창에서 역할(Roles)을 선택합니다. 그리고 파이프라인의 서비스 역할 이름(이 예제에서 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy)을 선택합니다.

8.    정책 연결(Attach Policies)을 선택합니다. 그리고 assumeprods3role을 선택합니다.

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

개발 계정에서 교차 계정 역할을 사용하도록 파이프라인 업데이트

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류 메시지가 표시되는 경우 AWS CLI 최신 버전을 사용 중인지 확인합니다.

1.    다음 AWS CLI 명령을 실행하여 codepipeline.json 파일로 파이프라인 정의를 검색합니다.

중요: crossaccountdeploy를 파이프라인 이름으로 바꿉니다.

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

2.    교차 계정 IAM 역할 ARN(roleArn)을 codepipeline.json 파일의 배포 작업 섹션에 추가합니다. 자세한 내용은 CodePipeline 사용 설명서의 CodePipeline 파이프라인 구조 참조를 참조하세요.

교차 계정 IAM roleArn 예제

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

교차 계정 IAM 역할 ARN을 포함하는 배포 작업 예제

중요: prod-account-id를 프로덕션 계정의 AWS 계정 ID로 바꿉니다.

{
  "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"
    }
  ]
}

3.    codepipeline.json 파일의 끝에서 메타데이터 섹션을 제거합니다.

중요: 메타데이터 섹션 앞에 있는 쉼표도 제거해야 합니다.

메타데이터 섹션 예제

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

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

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

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

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

2.    버킷 이름(Bucket name) 목록에서 개발 입력 S3 버킷을 선택합니다. 예를 들면 codepipeline-input-bucket입니다.

3.    업로드(Upload)를 선택합니다. 그런 다음 파일 추가(Add files)를 선택합니다.

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

5.    업로드(Upload)를 선택하여 파이프라인을 실행합니다. 파이프라인이 실행되면 다음과 같은 상황이 발생합니다.

  • 소스 작업이 개발 입력 S3 버킷(codepipeline-input-bucket)에서 sample-website.zip을 선택합니다. 그런 다음, 소스 작업이 이 zip 파일을 개발 계정의 아티팩트 버킷(codepipeline-us-east-1-0123456789) 내 소스 아티팩트로 배치합니다.
  • 배포 작업에서 CodePipeline 서비스 역할(AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy)은 프로덕션 계정에서 교차 계정 역할(prods3role)을 수임합니다.
  • CodePipeline은 교차 계정 역할(prods3role)을 사용하여 개발 계정에서 KMS 키 및 아티팩트 버킷에 액세스합니다. 그런 다음, CodePipeline은 프로덕션 계정에서 프로덕션 출력 S3 버킷(codepipeline-output-bucket)에 추출한 파일을 배포합니다.

참고: 프로덕션 계정이 프로덕션 출력 S3 버킷(codepipeline-output-bucket)의 추출된 객체 소유자입니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?