強欲で謙虚なツボツボ

趣味の読書の書の方

備忘録(AWS CodeBuild + CodePipeline + GitHub)

GitHubで特定のブランチへのpushがあったときに、CodeBuildとCodePipelineで自動的にECSへのデプロイを行うためにCodeBuildとCodePipelineの設定をした。

フロントエンドとバックエンドで2つのGitHubリポジトリとECSサービスがあるので、それぞれフロントエンド用のCodeBuildとCodePipeline・バックエンド用のCodeBuildとCodePipelineの2つを作成する。

ECRとECRの設定はこちら。

taopo.hatenablog.com

 

 

手順

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を設定し、それ以外はそのまま

    ここでの環境変数を後でbuildspec.ymlで使用する
    Name | Value | Type

    • AWS_DEFAULT_REGION                 | ap-northeast-1 | Plaintext
    • AWS_ACCOUNT_ID                         | ************       | Plaintext
    • AWS_ECR_REPOSITORY_NAME    | ************       | Plaintext
    • AWS_ECR_IMAGE_TAG                   | ************       | Plaintext
    • AWS_ECS_TASK_CONTAINER_NAME | ************       | Plaintext
  • 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のサービスが更新されたタスクを起動して自動デプロイが完了する。