第5回 CloudFormationテンプレートの実行(CodePipeline)
さて第5回の今回は、本記事に記載のCloudFormationテンプレートを用いて、自動デプロイ(CodePipeline)を構築していきます。
前回:[社内勉強会資料] CloudFormationで構築する自動デプロイ環境 ~ 4/6
CloudFormationで作成するリソース
- CloudFormationテンプレートを使って、以下のAWSリソースを作成します
- IAM
- Role
- S3
- Bucket
- CodePipeline
- CodeBuild
- IAM
CloudFormationテンプレート
deploy-backend.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: "Build and Deploy"
Metadata:
"AWS::CloudFormation::Interface":
ParameterGroups:
- Label:
default: "Project Name Prefix"
Parameters:
- ProjectName
- Label:
default: "Netowork Configuration"
Parameters:
- VpcId
- AppSecurityGroupId
- AppSubnetId1
- AppSubnetId2
- Label:
default: "Repository Configuration"
Parameters:
- SourcecodeConnectionArn
- TargetRepository
- TargetBranch
- Label:
default: "ECR Configuration"
Parameters:
- ECRName
Parameters:
ProjectName:
Default: usecase-auto-deploy
Type: String
# 手順ではAWSコンソール上で書き換えるようにしているが、"Default"を第1回の「GitHubへの接続」で作成した接続のARNにあらかじめ置き換えておいてもよい
SourcecodeConnectionArn:
Default: arn:aws:codestar-connections:ap-northeast-1:nnnnnnnnnnnn:connection/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Type: String
TargetBranch:
Default: develop
Type: String
# 手順ではAWSコンソール上で書き換えるようにしているが、"Default"をGithubに作成したブランチ名にあらかじめ置き換えておいてもよい
TargetRepository:
Default: xxxxx/yyyyyyy
Type: String
ECRName:
Default: "usecase-auto-deploy-ecr"
Type: String
Resources:
IAMRole:
Type: "AWS::IAM::Role"
Properties:
Path: "/service-role/"
RoleName: !Sub "CodeBuildServiceRole-${AWS::Region}-${ProjectName}"
AssumeRolePolicyDocument: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"codebuild.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"
MaxSessionDuration: 3600
# ハンズオン目的のため広めのポリシーとしてあるが、実運用で利用する場合は注意すること
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser"
- "arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess"
- "arn:aws:iam::aws:policy/AmazonVPCFullAccess"
- !Sub "arn:aws:iam::${AWS::AccountId}:policy/service-role/CodeBuildCloudWatchLogsPolicy-${AWS::Region}-${ProjectName}"
- !Sub "arn:aws:iam::${AWS::AccountId}:policy/service-role/CodeBuildBasePolicy-${AWS::Region}-${ProjectName}"
- !Sub "arn:aws:iam::${AWS::AccountId}:policy/service-role/CodeBuildManagedSecretPolicy-${AWS::Region}-${ProjectName}"
IAMRole2:
Type: "AWS::IAM::Role"
Properties:
Path: "/service-role/"
RoleName: !Sub "CodePipelineServiceRole-${AWS::Region}-${ProjectName}"
AssumeRolePolicyDocument: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"codepipeline.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"
MaxSessionDuration: 3600
# ハンズオン目的のため広めのポリシーとしてあるが、実運用で利用する場合は注意すること
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/AmazonS3FullAccess"
- "arn:aws:iam::aws:policy/AWSCodeDeployRoleForECS"
- "arn:aws:iam::aws:policy/AmazonSNSFullAccess"
- !Sub "arn:aws:iam::${AWS::AccountId}:policy/service-role/CodePipelineServicePolicy-${AWS::Region}-${ProjectName}"
CodePipelinePipeline:
Type: "AWS::CodePipeline::Pipeline"
Properties:
Name: !Sub "${ProjectName}-app-deploy-pipeline"
RoleArn: !GetAtt IAMRole2.Arn
ArtifactStore:
Location: !Sub "codepipeline-${AWS::Region}-${ProjectName}"
Type: "S3"
Stages:
-
Name: "Source"
Actions:
-
Name: "Source"
ActionTypeId:
Category: "Source"
Owner: "AWS"
Provider: "CodeStarSourceConnection"
Version: "1"
Configuration:
BranchName: !Ref TargetBranch
ConnectionArn: !Ref SourcecodeConnectionArn
FullRepositoryId: !Ref TargetRepository
OutputArtifactFormat: "CODE_ZIP"
OutputArtifacts:
-
Name: SourceOutput
Region: !Ref AWS::Region
Namespace: "SourceVariables"
RunOrder: 1
-
Name: "Build"
Actions:
-
Name: "Build"
ActionTypeId:
Category: "Build"
Owner: "AWS"
Provider: "CodeBuild"
Version: "1"
Configuration:
ProjectName: !Sub "${ProjectName}-app-build"
InputArtifacts:
-
Name: SourceOutput
OutputArtifacts:
-
Name: BuildOutput
Region: !Ref AWS::Region
Namespace: "BuildVariables"
RunOrder: 1
-
Actions:
-
ActionTypeId:
Category: "Deploy"
Owner: "AWS"
Provider: "ECS"
Version: "1"
Configuration:
ClusterName: !Sub "${ProjectName}-cluster"
FileName: "imagedefinitions.json"
ServiceName: !Sub "${ProjectName}-service"
InputArtifacts:
-
Name: BuildOutput
Name: "Deploy"
Region: !Ref AWS::Region
RunOrder: 1
Name: "Deploy"
CodeBuildProject:
Type: "AWS::CodeBuild::Project"
Properties:
Name: !Sub "${ProjectName}-app-build"
Source:
GitCloneDepth: 1
GitSubmodulesConfig:
FetchSubmodules: false
InsecureSsl: false
Location: !Sub "https://github.com/${TargetRepository}.git"
ReportBuildStatus: false
Type: "GITHUB"
BuildSpec: !Sub |
version: 0.2
phases:
pre_build:
commands:
- aws ecr get-login-password --region ${AWS::Region} | docker login --username AWS --password-stdin "$ECR_HOST"
build:
commands:
- docker build -t $ECR_HOST/$ECR_NAME:latest
.
post_build:
commands:
- docker push $ECR_HOST/$ECR_NAME:latest
- printf '[{"name":"%s","imageUri":"%s"}]' "app" $ECR_HOST/$ECR_NAME:latest > imagedefinitions.json
artifacts:
files:
- imagedefinitions.json
Artifacts:
Type: "NO_ARTIFACTS"
Cache:
Type: "NO_CACHE"
Environment:
ComputeType: "BUILD_GENERAL1_SMALL"
EnvironmentVariables:
-
Name: "ECR_HOST"
Type: "PLAINTEXT"
Value: !Sub "${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com"
- Name: "ECR_NAME"
Type: "PLAINTEXT"
Value: !Ref ECRName
Image: "aws/codebuild/amazonlinux2-x86_64-standard:3.0-21.03.09"
ImagePullCredentialsType: "CODEBUILD"
PrivilegedMode: true
Type: "LINUX_CONTAINER"
ServiceRole: !GetAtt IAMRole.Arn
TimeoutInMinutes: 60
QueuedTimeoutInMinutes: 480
EncryptionKey: !Sub "arn:aws:kms:${AWS::Region}:${AWS::AccountId}:alias/aws/s3"
BadgeEnabled: false
LogsConfig:
CloudWatchLogs:
Status: "ENABLED"
GroupName: "codebuild"
StreamName: !Sub "${ProjectName}-app-build-log"
S3Logs:
Status: "DISABLED"
EncryptionDisabled: false
自動デプロイの構築:deploy-backend.yamlの実行 ステップ1
- テンプレートの準備で「テンプレートの準備完了」を選択
- テンプレートの指定で「テンプレートファイルのアップロード」を選択
- テンプレートファイルのアップロードで「deploy-backend.yaml」(添付ファイル参照) をアップロード
- [次へ」をクリック
自動デプロイの構築:deploy-backend.yamlの実行 ステップ2
- スタック名に「usecase-auto-deploy-backend」を指定する
- ProjectName プロパティは変更不要
- SourcecodeConnectionArn プロパティは 1. 第1回 5.GitHubへの接続 > 接続一覧画面に記載されている ARNを入力する
- TargetRepository プロパティはGitHubのリポジトリ名を入力する
- TargetBranchk プロパティは1. 第1回 5.GitBucketへの接続 > 自分用ブランチの作成(page 4) に記載されているブランチ名を入力する
- [次へ」をクリック
自動デプロイの構築:deploy-backend.yamlの実行 ステップ3
自動デプロイの構築:deploy-backend.yamlの実行 ステップ4
自動デプロイの構築:スタック作成の結果を確認
連載の第5回となる今回はここまで。
次回 (最終回) の第6回は、自動デプロイの動作確認と作成したリソース削除をしていきます。