備忘録(AWS CodeBuild + CodePipeline + GitHub)
GitHubで特定のブランチへのpushがあったときに、CodeBuildとCodePipelineで自動的にECSへのデプロイを行うためにCodeBuildとCodePipelineの設定をした。
フロントエンドとバックエンドで2つのGitHubリポジトリとECSサービスがあるので、それぞれフロントエンド用のCodeBuildとCodePipeline・バックエンド用のCodeBuildとCodePipelineの2つを作成する。
ECRとECRの設定はこちら。
手順
CodeBuild → CodePipeline
一方のCodeBuildとCodePipelineの設定をしたのちに他方を設定する。(自動で作成されるRoleを使い回す)
Create build project
- Project name:適当に
- Description:無記入
- Build badge:未チェック
- Enable concurrent build limit:未チェック
- Additional configuration:無記入
- Source provider:GitHub
- Repository:Repository in my GitHub account
- GitHub repository:任意のリポジトリを選択
- Source version:webhookするブランチ名など
- Additional configuration:そのまま
- Webhook:チェック
- Build type:Single build
- Event type:PUSH
- Start a build under these condition:無記入
- Dont start a build under these condition:無記入
- Environment image:Managed image
- Operation system:Amazon Linux 2
- Runtime(s):Standard
- Image:aws/codebuild/amazonlinux2-x86_64_standard:3.0(一番下の選択肢)
- Image version:Always use the latest image for this runtime version
- Environment type:Linux
- Privileged:チェック
- Service role:New service role(2回目以降はExisting service role)
- Role name:そのまま
- Allow AWS CodeBuild to modify this service role so it can be used with this build project:チェック
- Additional configuration:Environment variablesを設定し、それ以外はそのまま
- Build specifications:Use a buildspec file
- Buildspec name:無記入
- Define batch configuration:無記入
- Type:No artifacts
- Encryption key:無記入
- Cache type:No cache(キャッシュを設定するとビルド速度が上がるが、キャッシュによるビルド失敗が生じることもある)
- CloudWatch logs:チェック
- Group name:無記入
- Stream name:無記入
- S3 logs:未チェック
Create build projectで作成完了。
補足
GitHubは表示されるダイアログに従ってパスワードとかを入力すれば接続できる。OAuthでGitHubに接続するとPublic repositoryとRepository in my GitHub accountの選択が表示される。
IAM Role
New service roleを選択したので、新しくロールができている。
そのロールにECRへのアクセス権限を追加する。
Resourceを"*"としておけば、他のCodeBuildでも当該Roleを使用できる。
{ "Effect": "Allow", "Resource": "*", "Action: [ "ecr:BatchCheckLayerAvailability", "ecr:CompleteLayerUpload", "ecr:GetAuthorizationToken", "ecr:InitiateLayerUpload", "ecr:PutImage", "ecr:UploadLayerPart" ] }
buildspec.yml
GitHubで管理するプロジェクトのルートにbuildspec.ymlを作成する。
version: 0.2 phases: pre_build: commands: - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com build: commands: - docker build -t $AWS_ECR_REPOSITORY_NAME:$AWS_ECR_IMAGE_TAG . # この末尾の「.」を忘れないように - docker tag $AWS_ECR_REPOSITORY_NAME:$AWS_ECR_IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$AWS_ECR_REPOSITORY_NAME:$AWS_ECR_IMAGE_TAG post_build: commands: - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$AWS_ECR_REPOSITORY_NAME:$AWS_ECR_IMAGE_TAG - printf '[{"name":"%s","imageUrl":"%s"}]' $AWS_ECS_TASK_CONTAINER_NAME $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$AWS_ECR_REPOSITORY_NAME:$AWS_ECR_IMAGE_TAG > imagedefinitions.json artifacts: files: - '**/*'
CodePipeline
Step 1 Choose pipeline setting
- Pipeline name:任意
- Service role:New service role(2回目以降はExisting service role)
- Role name:自動で入力される
- Allow AWS CodePipeline to create a service role so it can be used with this new pipeline:チェック
- Advanced settings:そのまま
Step 2 Add source stage
Connectionは入力欄押下時に選択したいものがない場合は、Connect to GitHubをクリック。
ダイアログが表示されるので指示に従って接続する。
- Source provider:GitHub(Version 2)
- Connection:下記説明
- Repository name:任意
- Branch name:任意
- Start the pipeline on source code change:チェック
- Output artifact format:CodePipeline default
Step 3 Add build stage
- Build provider:AWS CodeBuild
- Region:Asia Pacific(Tokyo)
- Project name:CodeBuild で作成済みのものを選択
- Add environment variable:無記入
- Build type:Single build
Step 4 Add deploy stage
- Deploy provider:Amazon ECS
- Region:Asia Pacific(Tokyo)
- Cluster name:ECSで作成済みのClusterを選択
- Service name:ECSで作成済みのServiceを選択
- Image definitions file:無記入
- Deployment timeout:無記入
Step 5 Review
Step 1~4までの入力を確認して、Create pipelineで作成完了。
これでgit pushすればwebhookによって自動的にCodeBuildでビルドされたDockerイメージがECRへプッシュされ、ECSのタスク定義がECRにプッシュされたDockerイメージを参照するように更新され、ECSのサービスが更新されたタスクを起動して自動デプロイが完了する。