開発アカウントに CodeCommit を使用して、プロダクションアカウントでビルドやデプロイを行うためのメモ。
1. プロダクションアカウント
1-1. CodePipeline のサービスロールのためのポリシーを作成する
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:GetBucketVersioning"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::codepipeline*",
"arn:aws:s3:::elasticbeanstalk*"
],
"Effect": "Allow"
},
{
"Action": [
"codecommit:CancelUploadArchive",
"codecommit:GetBranch",
"codecommit:GetCommit",
"codecommit:GetUploadArchiveStatus",
"codecommit:UploadArchive"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"codedeploy:CreateDeployment",
"codedeploy:GetApplicationRevision",
"codedeploy:GetDeployment",
"codedeploy:GetDeploymentConfig",
"codedeploy:RegisterApplicationRevision"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"elasticbeanstalk:*",
"ec2:*",
"elasticloadbalancing:*",
"autoscaling:*",
"cloudwatch:*",
"s3:*",
"sns:*",
"cloudformation:*",
"rds:*",
"sqs:*",
"ecs:*",
"iam:PassRole"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"lambda:InvokeFunction",
"lambda:ListFunctions"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"opsworks:CreateDeployment",
"opsworks:DescribeApps",
"opsworks:DescribeCommands",
"opsworks:DescribeDeployments",
"opsworks:DescribeInstances",
"opsworks:DescribeStacks",
"opsworks:UpdateApp",
"opsworks:UpdateStack"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"cloudformation:CreateStack",
"cloudformation:DeleteStack",
"cloudformation:DescribeStacks",
"cloudformation:UpdateStack",
"cloudformation:CreateChangeSet",
"cloudformation:DeleteChangeSet",
"cloudformation:DescribeChangeSet",
"cloudformation:ExecuteChangeSet",
"cloudformation:SetStackPolicy",
"cloudformation:ValidateTemplate",
"iam:PassRole"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"codebuild:BatchGetBuilds",
"codebuild:StartBuild"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Effect": "Allow",
"Action": [
"devicefarm:ListProjects",
"devicefarm:ListDevicePools",
"devicefarm:GetRun",
"devicefarm:GetUpload",
"devicefarm:CreateUpload",
"devicefarm:ScheduleRun"
],
"Resource": "*"
}
]
}
1-2. CodePipeline のサービスロールを作成する
CodePipeline サービスのロールを作成する
1-3. IAMの暗号化キーを作成する
- IAM から 暗号化キー を選択して、使用するリージョンで キーの作成 を選択する
- エイリアスと説明の作成で、エイリアス を入力し 次のステップ を選択する
- タグの追加で必要に応じてタグを追加し、次のステップ を選択する
- キーの使用アクセス許可の定義 の キー管理者 を必要に応じて設定し、次のステップ を選択する
- キーの使用アクセス許可の定義 の このアカウント で 1-2 の手順で作成した CodePipeline のサービスロールを選択する、
外部アカウント で 外部アカウントの追加 を選択して開発アカウントIDを入力する
- キーポリシーのプレビューで 完了 を選択する
1-4. CodePipeline のサービスロールに暗号化キーのポリシーを追加する
1-2 の手順で作成した CodePipeline のロールに 1-3 の手順で作成した暗号化キーの ARN をリソースに設定して作成したポリシーをアタッチする
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"kms:*"
],
"Resource": [
"arn:aws:kms:ap-northeast-1:${ProductionAccount}:key/2222222-3333333-4444-556677EXAMPLE"
]
}
}
1-5. CodeBuild のサービスロールのためのポリシーを作成する
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"codebuild:*",
"iam:PassRole",
"logs:FilterLogEvents",
"logs:GetLogEvents",
"logs:CreateLogStream",
"logs:CreateLogGroup",
"logs:PutLogEvents",
"s3:CreateBucket",
"s3:GetObject",
"s3:List*",
"s3:PutObject"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
1-6. CodeBuild のサービスロールを作成する
CodeBuild サービスのロールを作成し、1-5 の手順で作成した CodeBuild のポリシーと 1-4 の手順で作成したポリシーをアタッチする
2. 開発アカウント
2-1. CodeCommit にクロスアカウントアクセスのためのポリシーを作成する
1-3 の手順で作成した暗号化キーの ARN を設定して、
クローンしたイメージを暗号化して CodePipeline の S3 に PutObject するためのポリシーを作成する。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"codecommit:BatchGetRepositories",
"codecommit:Get*",
"codecommit:GitPull",
"codecommit:List*",
"codecommit:CancelUploadArchive",
"codecommit:UploadArchive",
"s3:*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"kms:*"
],
"Resource": [
"arn:aws:kms:ap-northeast-1:${ProductionAccount}:key/2222222-3333333-4444-556677EXAMPLE"
]
}
]
}
2-2. CodeCommit のロールを作成する
- IAM から ロール を選択し ロールの作成 を選択する
- 別のAWSアカウント を選択し、アカウントID にプロダクションアカウントのアカウントIDを入力し、次のステップ:アクセス権限 を選択する
- 2-1 の手順で作成したポリシーをアタッチし、次のステップ:確認 を選択する
- ロール名を入力し、ロールの作成 を選択する
2-3. CodeCommit を作成する
CodeCommit を作成する。CodeCommit はあらかじめ作成しておいてもよい。
3. プロダクションアカウント
3-1. CodePipeline のサービスロールに開発アカウントのポリシーを追加
CodePipeline に開発アカウントの CodeCommit のロールにアクセスするポリシーを作成しアタッチする
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::${DevelopAccount}:role/${CodeCommitRoleName}"
]
}
]
}
3-2. CodePipeline の Artifact Store となる S3 Bucket を作成する
codebuild.amazonaws.com サービスと開発アカウントの CodeCommit ロールからアクセスされる CodePipeline で使う S3 Bucket を作成する。
Key |
Description |
BucketName |
CodePipeline が使用するバケット名 |
CodeCommitRoleName |
2-2 の手順で作成したロール名 |
DevelopAccount |
開発アカウントID |
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
BucketName:
Type: String
CodeCommitRoleName:
Type: String
DevelopAccount:
Type: String
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref BucketName
BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref S3Bucket
PolicyDocument:
Statement:
- Action: s3:*
Effect: Allow
Resource:
- !Sub arn:aws:s3:::${BucketName}
- !Sub arn:aws:s3:::${BucketName}/*
Principal:
Service:
- codebuild.amazonaws.com
AWS:
- !Sub arn:aws:iam::${DevelopAccount}:role/${CodeCommitRoleName}
3-3. CodeBuild
Key |
Description |
CacheLocation |
CodeBuild のキャッシュが使用するバケット名 |
CodeBuildRoleName |
1-6 の手順で作成したロール名 |
Image |
CodeBuildに使用するコンテナ名 |
Name |
CodeBuild名 |
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
CacheLocation:
Type: String
CodeBuildRoleName:
Type: String
Image:
Type: String
Name:
Type: String
Resources:
CodeBuild:
Type: AWS::CodeBuild::Project
Properties:
Artifacts:
Type: CODEPIPELINE
Cache:
Location: !Sub ${CacheLocation}/ivy2
Type: S3
Description: !Ref Name
EncryptionKey: arn:aws:kms:ap-northeast-1:${ProductionAccount}:key/2222222-3333333-4444-556677EXAMPLE
Environment:
ComputeType: BUILD_GENERAL1_SMALL
Image: !Ref Image
EnvironmentVariables:
- Name: BUCKET_NAME
Value: !Ref CacheLocation
PrivilegedMode: true
Type: LINUX_CONTAINER
Name: !Ref Name
ServiceRole: !Sub arn:aws:iam::${AWS::AccountId}:role/${CodeBuildRoleName}
Source:
Type: CODEPIPELINE
3-4. CodePipeline
Key |
Description |
BucketName |
3-2 の手順で作成したバケット名 |
CodeCommitRoleName |
2-2 の手順で作成したロール名 |
CodePipelineRoleName |
1-2 の手順で作成したロール名 |
DevelopAccount |
開発アカウントID |
Name |
CodePipeline名 |
RepositoryName |
2-3 の手順で作成した CodeCommit リポジトリ名 |
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
BucketName:
Type: String
CodeCommitRoleName:
Type: String
CodePipelineRoleName:
Type: String
DevelopAccount:
Type: String
Name:
Type: String
RepositoryName:
Type: String
Resources:
CodePipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
ArtifactStore:
EncryptionKey:
Id: arn:aws:kms:ap-northeast-1:${ProductionAccount}:key/2222222-3333333-4444-556677EXAMPLE
Type: KMS
Location: !Ref BucketName
Type: S3
Name: !Ref Name
RoleArn: !Sub arn:aws:iam::${AWS::AccountId}:role/${CodePipelineRoleName}
Stages:
- Actions:
- ActionTypeId:
Category: Source
Owner: AWS
Provider: CodeCommit
Version: 1
Configuration:
PollForSourceChanges: false
RepositoryName: !Ref RepositoryName
BranchName: master
Name: source
OutputArtifacts:
- Name: MyApp
RoleArn: !Sub arn:aws:iam::${DevelopAccount}:role/${CodeCommitRoleName}
Name: source
- Actions:
- ActionTypeId:
Category: Build
Owner: AWS
Provider: CodeBuild
Version: 1
Configuration:
ProjectName: !Ref Name
InputArtifacts:
- Name: MyApp
OutputArtifacts:
- Name: App
Name: build
Name: build
参考