CodePipeline을 사용하여 다른 계정에 AWS CloudFormation 스택을 어떻게 배포합니까?

최종 업데이트 날짜: 2019년 12월 9일

AWS CodePipeline을 사용하여 다른 계정에 AWS CloudFormation 스택을 어떻게 배포할 수 있습니까?

간략한 설명

다른 계정에 AWS CloudFormation 스택을 배포하려면 다음을 완료해야 합니다.

  1. 하나의 계정, 계정 A에서 파이프라인을 생성합니다. 이 계정에는 고객 관리형 AWS Key Management Service(AWS KMS) 키, 아티팩트를 위한 Amazon Simple Storage Service(Amazon S3) 버킷, 다른 계정인 계정 B로부터의 액세스를 허용하는 S3 버킷 정책이 포함되어야 합니다.
  2. 계정 B에서 다음을 허용하는 계정 간 서비스 역할을 구성합니다. 1) AWS CloudFormation 작업, 2) 계정 A에서 S3 버킷에 대한 액세스, 3) 계정 A에서 고객 관리형 KMS 키를 사용한 암호 해독
  3. 계정 A에서 파이프라인 서비스 역할이 계정 B에서 계정 간 역할 AssumeRole을 맡도록 허용합니다.

​해결 방법

계정 A에서 고객 관리형 키 생성

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

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

3.    키 생성을 선택한 후 대칭을 선택합니다.

참고: 고급 옵션 섹션에서 오리진을 KMS로 그대로 둡니다.

4.    별칭에 키 이름을 입력합니다.

5.    (선택 사항) 태그를 추가한 후 다음을 선택합니다.

6.    키 관리 권한 정의 페이지의 키 관리자에서 키의 관리자로 지정할 AWS Identity and Access Management(IAM) 사용자 및 기타 사용자 또는 그룹을 선택한 후 다음을 선택합니다.

7.    키 사용 권한 정의 페이지의 이 계정에서 키에 액세스해야 할 계정(예: CodePipeline 서비스 역할)에 IAM 사용자를 추가합니다.

8.    기타 AWS 계정 섹션에서 다른 AWS 계정 추가를 선택하고 계정 B에 IAM 역할의 Amazon 리소스 이름(ARN)을 입력합니다.

9.    다음을 선택하고 마침을 선택합니다.

10.    고객 관리형 키 섹션에서 방금 생성한 키를 선택한 다음, 해당 키의 ARN을 복사합니다.

참고: 파이프라인을 편집하고 정책을 구성할 때 키의 ARN이 있어야 합니다.

계정 A에서 SourceArtifact 버킷의 파이프라인으로 Amazon S3 버킷을 선택하거나 생성한 후 버킷 정책 생성

계정 A의 S3 버킷 정책이 계정 B에 대해 액세스를 허용해야 합니다.

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

2.    CodePipeline의 ArtifactStore로 사용할 기존 S3 버킷을 선택하거나 새 S3 버킷을 생성합니다.

참고: 아티팩트에 스택 템플릿 파일, 템플릿 구성 파일 또는 둘 다가 포함될 수 있습니다. CodePipeline은 이러한 아티팩트를 통해 AWS CloudFormation 스택 및 변경 세트를 사용합니다. 템플릿 구성 파일에서 템플릿 파라미터 값, 스택 정책 및 태그를 지정해야 합니다.

3.    버킷의 Amazon S3 세부 정보 페이지에서 권한을 선택합니다.

4.    버킷 정책을 선택합니다.

5.    버킷 정책 편집기에서 다음 코드를 입력합니다.

{
  "Id": "Policy1553183091390",
  "Version": "2012-10-17",
  "Statement": [{
      "Sid": "",
      "Action": [
        "s3:Get*",
        "s3:Put*"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::codepipeline-source-artifact/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::ACCOUNT_B_NO:root"
        ]
      }
    },
    {
      "Sid": "",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::codepipeline-source-artifact",
      "Principal": {
        "AWS": [
          "arn:aws:iam::ACCOUNT_B_NO:root"
        ]
      }
    }
  ]
}

6.    이전 코드에서 codepipeline-source-artifact를 CodePipeline의 SourceArtifact 버킷 이름으로 바꿉니다.

7.    이전 코드에서 ACCOUNT_B_NO계정 B의 계정 번호로 바꿉니다.

8.    저장을 선택합니다.

계정 B에서 계정 A에 대해 SourceArtifact에서 S3 및 KMS 관련 작업을 허용하는 교차 계정 역할(CROSS_ACCOUNT_ROLE) 생성

교차 계정 역할 정책은 계정 A의 파이프라인이 계정 B의 역할을 맡는 것을 허용합니다. 또한 이 정책은 AWS CloudFormation 작업과 SourceArtifact 및 KMS 관련 작업에 대한 액세스를 지원합니다.

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

2.    탐색 창에서 정책을 선택합니다.

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

4.    JSON 보기를 선택한 후 코드 편집기에 다음 정책을 입력합니다.

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Action": [
        "cloudformation:*",
        "iam:PassRole"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:Put*",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-source-artifact/*"
      ]
    }
  ]
}

5.    이전 코드에서 codepipeline-source-artifact를 파이프라인의 ArtifactStore 버킷 이름으로 바꿉니다.

6.    정책 검토를 선택한 후 정책을 생성합니다.

7.    탐색 창에서 정책을 선택합니다.

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

9.    JSON 보기를 선택한 후 코드 편집기에 다음 정책을 입력합니다.

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "kms:DescribeKey",
      "kms:GenerateDataKey*",
      "kms:Encrypt",
      "kms:ReEncrypt*",
      "kms:Decrypt"
    ],
    "Resource": [
      "arn:aws:kms:REGION:ACCOUNT_A_NO:key/key-id"
    ]
  }]
}

10.    이전 코드에서 arn:aws:kms:REGION:ACCOUNT_A_NO:key/key-id를 앞의 계정 A에 고객 관리형 키 생성 섹션에서 생성한 키의 ARN으로 바꿉니다.

11.    정책 검토를 선택한 후 정책을 생성합니다.

12.    탐색 창에서 역할을 선택합니다.

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

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

15.    계정 ID계정 A의 계정 ID를 입력합니다.

16.    다음: 권한을 선택한 후 역할 생성 단계를 완료합니다.

17.    교차 계정 역할 정책 및 KMS 키 정책을 방금 생성한 역할에 연결합니다.

계정 A에서 CodePipeline 서비스 역할에 AssumeRole 권한 추가

정책은 계정 A의 CodePipeline 서비스 역할이 앞서 계정 B에서 생성한 교차 계정 역할을 맡는 것을 허용합니다.

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

2.    탐색 창에서 역할을 선택합니다.

3.    CodePipeline에 사용 중인 IAM 서비스 역할을 선택합니다.

4.    인라인 정책 추가를 선택합니다.

5.    JSON 보기를 선택한 후 코드 편집기에 다음 정책을 입력합니다.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": [
      "arn:aws:iam::ACCOUNT_B_NO:role/*"
    ]
  }
}

6.    이전 코드에서 ACCOUNT_B_NO계정 B의 번호로 바꿉니다.

7.    정책 검토를 선택한 후 정책을 생성합니다.

계정 B에서 AWS CloudFormation 스택에 대한 역할(CFN_STACK_ROLE) 생성

서비스 역할은 계정 B의 AWS CloudFormation 스택에 직접 구성되며, 스택에서 배포한 서비스에 대한 권한을 포함해야 합니다.

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

2.    탐색 창에서 역할을 선택합니다.

3.    자동으로 서비스를 시작할 때 사용할 AWS CloudFormation의 역할을 생성합니다.

4.    필요에 따라 역할에 권한을 적용합니다.

중요: 신뢰 정책이 AWS CloudFormation에 대한 신뢰 정책이고 역할에 스택에서 배포한 서비스에 액세스할 권한이 있는지 확인하십시오.

계정 A에서 CodePipeline 구성 업데이트

참고: 다른 계정과 연결된 리소스를 사용하는 파이프라인을 생성하거나 편집하기 위해 CodePipeline 콘솔을 사용할 수 없습니다. 하지만 콘솔을 사용하여 파이프라인의 일반 구조를 생성할 수 있습니다. 그런 다음, AWS 명령줄 인터페이스(AWS CLI)를 사용하여 파이프라인을 편집하고 다른 계정과 연결된 리소스를 추가할 수 있습니다. 또는 현재 파이프라인을 새 파이프라인의 리소스로 업데이트할 수 있습니다.

1.    AWS CLI에서 다음 명령을 실행하여 파이프라인 JSON 구조를 가져올 수 있습니다.

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

2.    로컬 pipeline.json 파일에서 encryptionKey ID에 앞에서 생성한 키의 ARN과 함께 ID가 포함되어 있는지 확인합니다.

3.    pipeline.json 파일에서 AWS CloudFormation 작업 구성을 업데이트합니다.

참고: 파이프라인에 대한 작업 구성 JSON 구조 내부의 RoleArn은 AWS CloudFormation 스택에 대한 역할(CFN_STACK_ROLE)입니다. 작업 구성 JSON 구조 외부의 roleArn은 파이프라인이 AWS CloudFormation 스택을 운영하기 위해 맡는 교차 계정 역할(CROSS_ACCOUNT_ROLE)입니다.

4.    역할이 RoleArnroleArn에 대해 모두 업데이트되었는지 확인합니다.

다음 코드 예제에서 RoleArn은 스택을 시작하기 위해 AWS CloudFormation에 전달된 역할입니다. CodePipeline은 roleArn을 사용하여 AWS CloudFormation 스택을 운영합니다.

{
  "name": "Prod_Deploy",
  "actions": [{
    "inputArtifacts": [{
      "name": "MyApp"
    }],
    "name": "test-cfn-x",
    "actionTypeId": {
      "category": "Deploy",
      "owner": "AWS",
      "version": "1",
      "provider": "CloudFormation"
    },
    "outputArtifacts": [],
    "configuration": {
      "ActionMode": "CHANGE_SET_REPLACE",
      "ChangeSetName": "test",
      "RoleArn": "ARN_FOR_CFN_STACK_ROLE",
      "Capabilities": "CAPABILITY_IAM",
      "StackName": "test-cfn-sam",
      "TemplatePath": "MyApp::template.yaml"
    },
    "roleArn": "ARN_FOR_CROSS_ACCOUNT_ROLE",
    "runOrder": 1
  }]
}

5.    pipeline.json 파일에서 메타데이터 구성을 제거합니다.

"metadata": {
  "pipelineArn": "arn:aws:codepipeline:REGION:ACC:my_test",
  "updated": 1551216777.183,
  "created": 1551207202.964
}

중요: 올바른 JSON 서식을 정렬하려면 메타데이터 섹션 앞에 있는 쉼표를 제거합니다.

6.    (선택 사항) 파이프라인을 생성하고 JSON 구조를 업데이트하려면 다음 명령을 실행하여 새 구성 파일로 파이프라인을 업데이트합니다.

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

7.    (선택 사항) 현재 파이프라인을 사용하고 JSON 구조를 업데이트하려면 다음 명령을 실행하여 새로운 파이프라인을 생성합니다.

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

참고: pipeline.json  파일에서 새 파이프라인 이름을 변경합니다.


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

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


도움이 필요하십니까?