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

8분 분량
0

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

해결 방법

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

  • 두 개의 계정인 개발 계정과 프로덕션 계정이 있습니다.
  • 개발 계정의 입력 버킷 이름은 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 IAM 콘솔을 엽니다.

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

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

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

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

6.    키 구성 요소 오리진에서 KMS를 선택합니다. 그리고 다음을 선택합니다.

7.    별칭에 키의 별칭을 입력합니다. 예: s3deploykey.

8.    다음을 선택합니다. 키 관리 권한 정의 페이지가 열립니다.

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

  1.     다음을 선택합니다. 키 사용 권한 정의 페이지가 열립니다.

11.    기타 AWS 계정 섹션에서 다른 AWS 계정 추가를 선택합니다.

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

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

13.    키 정책을 검토합니다. 그런 다음 마침을 선택합니다.

개발 계정에서 CodePipeline 생성

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

2.    파이프라인 이름에 파이프라인 이름을 입력합니다. 예: crossaccountdeploy.

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

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

4.    아티팩트 저장소에서 기본 위치를 선택합니다.
참고: 사용 사례에 필요한 경우 사용자 지정 위치를 선택할 수 있습니다.

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

6.    KMS 고객 관리형 키의 경우 목록에서 키 별칭(이 예에서는 s3deploykey)을 선택하고 다음을 선택합니다. 소스 스테이지 추가 페이지가 열립니다.

  1.     소스 공급자Amazon S3를 선택합니다.

8.    버킷에 개발 입력 S3 버킷의 이름을 입력합니다. 예: codepipeline-input-bucket.

중요: CodePipeline과 함께 작동하려면 입력 버킷의 버전 관리가 활성화되어 있어야 합니다.

9.    S3 객체 키sample-website.zip를 입력합니다.

중요: 자체 웹 사이트 대신 샘플 AWS 웹 사이트를 사용하려면 자습서: Amazon S3를 배포 공급자로 사용하는 파이프라인 생성을 참조하십시오. 그런 다음 사전 요구 사항1: Amazon S3에 정적 웹 사이트 파일 배포 섹션에서 찾아 "샘플 정적 웹 사이트"를 검색하십시오.

10.    변경 감지 옵션에서 **Amazon CloudWatch 이벤트(권장)**를 선택합니다. 그리고 다음을 선택합니다.

11.    빌드 단계 추가 페이지에서 빌드 단계 건너뛰기를 선택합니다. 그런 다음 건너뛰기를 선택합니다.

12.    배포 스테이지 추가 페이지의 배포 공급자에서 Amazon S3를 선택합니다.

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

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

  • 여러 복제본이 있는 AWS KMS 다중 리전 키를 사용하고 있습니다.
  • 파이프라인의 두 리전 모두에 아티팩트 저장소가 있습니다.

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

15.    배포하기 전에 파일 압축 풀기 확인란을 선택합니다.
참고: 필요한 경우 배포 경로에 경로를 입력합니다.

16.    다음을 선택합니다.

17.    파이프라인 생성을 선택합니다. 파이프라인이 실행되지만 소스 스테이지는 실패합니다. 다음과 같은 오류가 표시됩니다. "The object with key 'sample-website.zip' does not exist."

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

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

중요: 기존 CodePipeline 서비스 역할을 사용하는 경우 이 섹션을 건너뛰십시오.

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

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

  1. 키 사용자 섹션에서 추가를 선택합니다.

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

  1. 추가를 선택합니다.

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

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

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

2.    탐색 창에서 정책을 선택합니다. 그런 다음 정책 생성을 선택합니다.

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.    정책 검토를 선택합니다.

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

  1. 정책 생성을 선택합니다.

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

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

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.    정책 검토를 선택합니다.

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

  1. 정책 생성을 선택합니다.

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

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

  1. 탐색 창에서 역할을 선택합니다. 그런 다음 역할 생성을 선택합니다.

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

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

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

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

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

8.    (선택 사항) 태그를 추가하고 다음: 검토를 선택합니다.

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

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

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

12.    신뢰 관계를 선택합니다. 그런 다음, 신뢰 관계 편집을 선택합니다.

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

중요: 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.    신뢰 정책 업데이트를 선택합니다.

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

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

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

3.    권한을 선택합니다. 그런 다음 버킷 정책을 선택합니다.

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.    저장을 선택합니다.

생성한 교차 계정 역할을 맡을 수 있도록 허용하는 정책을 개발 계정의 CodePipeline 서비스 역할에 연결

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

2.    탐색 창에서 정책을 선택합니다. 그런 다음 정책 생성을 선택합니다.

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.    정책 검토를 선택합니다.

5.    이름assumeprods3role을 입력합니다.

  1. 정책 생성을 선택합니다.

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

8.    정책 연결을 선택합니다. 그런 다음 assumeprods3role을 선택합니다.

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

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

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

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

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

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

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

교차 계정 IAM 역할 Arn의 예

"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.    버킷 이름 목록에서 개발 출력 S3 버킷을 선택합니다. 예: codepipeline-input-bucket.

3.    업로드를 선택합니다. 그런 다음 파일 추가를 선택합니다.

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

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

  • 소스 작업이 개발 입력 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)에서 추출된 객체의 소유자입니다.

AWS 공식
AWS 공식업데이트됨 5달 전