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

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

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.    IAM 콘솔을 엽니다.

2.    [암호화 키]를 선택합니다.

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

4.    키에 대한 별칭 및 설명을 생성한 후 [다음 단계]를 선택합니다.

5.    (선택 사항) 태그를 추가한 후 [다음 단계]를 선택합니다.

6.    encryptionKey_sections.management의 경우 AWS Identity and Access Management(IAM) 사용자를 선택하고 키 관리자 역할을 할 다른 사용자 또는 그룹을 선택한 후 [Next]를 선택합니다.

7.    keyUsage_sections.internal의 경우 계정에서 키 액세스 권한(예: CodePipeline 서비스 역할)이 있어야 하는 IAM 사용자를 추가합니다.

8.    keyUsage_sections.external의 경우 계정 B에서 IAM 역할의 Amazon 리소스 이름(ARN)을 추가합니다.

9.    [다음 단계]를 선택한 후 keyUsage.finish를 선택합니다.

10.    탐색 창에서 encryptionKeys.keys를 선택합니다.

11.    별칭 열에서 키를 선택합니다.

12.    [general_configuration] 섹션에서 [encryptionKey_details_tab_summary.keyArn]에 키의 ARN을 복사합니다.

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

계정 A에 대한 Amazon S3 SourceArtifacts 버킷의 정책 생성

Amazon S3의 정책은 계정 A계정 B에 액세스하도록 허용합니다.

1.    Amazon S3 콘솔을 엽니다.

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

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

계정 A에 대한 서비스 역할 정책 생성

이 서비스 역할 정책을 사용하여 계정 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에 대한 교차 계정 역할 정책 생성

교차 계정 역할 정책을 사용하여 계정 A계정 B의 역할을 맡게 되고 AWS CloudFormation 작업을 활성화할 수 있습니다.

1.    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.    [정책 검토]를 선택한 후 정책을 생성합니다.

계정 B에 대한 키 정책 생성

1.    IAM 콘솔을 엽니다.

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

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

4.    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:ACCOUNT_A_NO:key/key-id"
    ]
  }]
}

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

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

새 교차 계정 역할 생성

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

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

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

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

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

6.    이전에 생성한 교차 계정 역할 정책 및 KMS 키 정책을 역할에 연결합니다.

AWS CloudFormation 스택에 대한 역할 생성

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

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

중요: 신뢰 정책이 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에 계정 A에 대한 고객 관리형 키 생성 섹션에서 이전에 생성한 키의 ARN과 함께 ID가 포함되어 있는지 확인합니다.

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

참고: 파이프라인에 대한 작업 구성 JSON 구조 내부 RoleArn은 AWS CloudFormation 스택의 역할입니다. 작업 구성 JSON 구조 외부의 roleArn은 파이프라인이 AWS CloudFormation 스택을 작동시키는 작업을 담당하는 교차 계정 역할입니다.

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

다음 코드 예제에서 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_CFNSTACKROLE",
      "Capabilities": "CAPABILITY_IAM",
      "StackName": "test-cfn-sam",
      "TemplatePath": "MyApp::template.yaml"
    },
    "roleArn": "ARN_FOR_CROSS_ACCOUNT",
    "runOrder": 1
  }]
}

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

"metadata": {
  "pipelineArn": "arn:aws:codepipeline:us-east-1: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에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?