[AWS] 교차 계정 CodePipeline 구성
1. 교차 계정 파이프라인 구조
개발자들이 PROD 인프라 계정에는 보안상 접근이 제한된 경우가 있다.
이럴 경우 DEV 계정에 있는 파이프라인에서 PROD 계정 쪽으로 배포할 수 있도록 구성할 수 있다.
빌드까지는 DEV 계정에서 진행된 후, cross account role을 사용해 PROD 계정의 CodeDeploy로 접근 후 배포하는 구조이다.
위 그림을 참고하면 이해에 도움이 된다.
2. 서비스 역할 및 정책 설정
DEV 계정에 CodeCommit과 CodeBuild가 있고, PROD 계정에 CodeDeploy가 있는 상황에서 이들을 하나의 파이프라인으로 묶는 과정이다.
[1] KMS 생성
DEV 계정 에서 고객 관리형 KMS를 생성한다.
키 설정은 기본값으로 두고 관리자를 선택 후, KMS키를 사용할 사용자(역할)을 선택하는 화면에서 CodePipeline이 사용하는 역할과 PROD 계정 을 추가한다.
CodePipeline과 PROD계정은 생성된 고객 관리형 KMS를 통해 Artifact S3에 접근하게 된다.
[2] Artifact S3 정책 설정
DEV 계정 에 위치한 Artifact S3에 다음과 같이 접근 정책을 설정한다.
{
"Version": "2012-10-17",
"Id": "SSEAndSSLPolicy",
"Statement": [
{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "<코드파이프라인 ARN>/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "aws:kms"
}
}
},
{
"Sid": "DenyInsecureConnections",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "<코드파이프라인 ARN>/*",
"Condition": {
"Bool": {
"aws:SecureTransport": false
}
}
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<PROD 계정 ID>:root"
},
"Action": ["s3:Get*", "s3:Put*"],
"Resource": "<코드파이프라인 ARN>/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<PROD 계정 ID>:root"
},
"Action": "s3:ListBucket",
"Resource": "<코드파이프라인 ARN>"
}
]
}
이제 해당 S3에는 CodePipeline과 PROD계정이 KMS를 사용해 접근할 수 있다.
[3] 교차 계정 IAM 역할 생성
PROD 계정에서 DEV 계정 이 사용할 수 있는 역할을 생성한다.
다음과 같은 인라인 정책을 추가한다.
-
아티팩트 S3에 접근
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "s3:Put*", "s3:Get*", "codecommit:ListRepositories", "codecommit:ListBranches" ], "Resource": "<Artifact S3 버킷 ARN>/*" } ] }
-
KMS 사용
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Encrypt", "kms:DescribeKey", "kms:Decrypt" ], "Resource": "<KMS ARN>" } ] }
-
CodeDeploy 사용
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "codedeploy:RegisterApplicationRevision", "codedeploy:GetDeploymentConfig", "codedeploy:GetDeployment", "codedeploy:GetApplicationRevision", "codedeploy:GetApplication", "codedeploy:CreateDeployment" ], "Resource": "*" } ] }
-
ECS 사용
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": "ecs:*", "Resource": "*" } ] }
-
역할을 ECS 작업에게 전달 (PassRole)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "*", "Condition": { "StringEqualsIfExists": { "iam:PassedToService": "ecs-tasks.amazonaws.com" } } } ] }
[4] CodePipeline 역할 정책 추가
DEV 계정의 CodePipeline이 [3]에서 생성한 PROD 계정의 역할을 사용할 수 있도록 다음 인라인 정책을 추가한다.
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": ["<교차계정 IAM 역할 ARN>"]
}
}
3. CodePipeline 설정
CodePipeline에 Deploy 스테이지를 추가한다.
PROD 계정의 CodeDeploy 어플리케이션과 배포 그룹을 기입한다.
해당 어플리케이션과 배포그룹을 찾을 수 없다고 뜰텐데, 무시해도 된다. DEV계정에 있는 것이 아니니 당연히 못찾는다.
이제 파이프라인이 PROD계정의 CodeDeploy로 넘어갈 수 있도록 역할 설정을 해줘야 한다.
AWS CLI를 통해 DEV 계정의 파이프라인 설정을 json 형태로 가져온다.
aws codepipeline get-pipeline --name 파이프라인 이름 > pipeline.json
pipeline.json을 열고, [1]에서 생성한 고객 관리형 KMS를 사용하도록 설정한다.
"artifactStore": {
"type": "S3",
"location": "<Artifact S3 버킷 ARN>",
"encryptionKey": {
"id": "[1]에서 생성한 KMS ARN",
"type": "KMS"
}
Deploy 스테이지에서 PROD 계정의 역할을 사용하도록 설정한다.
{
"name": "Deploy",
.
.
.
"inputArtifacts": [
{
"name": "BuildArtifact"
}
],
"roleArn": "[3]에서 생성한 교차 계정 IAM 역할 ARN",
"region": "ap-northeast-2",
"namespace": "DeployVariables"
}
PROD 계정의 역할을 사용하기 때문에 PROD 계정에 있는 CodeDeploy 어플리케이션에 접근할 수 있다.
맨 아래 위치한 metadata 정보는 지워준다.
"metadata": {
"pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name",
"created": "date",
"updated": "date"
}
다 설정했다면 파일을 ANSI 인코딩 타입으로 저장 후 다음 AWS CLI 명령어로 적용한다.
aws codepipeline update-pipeline --cli-input-json file://pipeline.json
댓글남기기