👻

AWS入門 - CodePipeline 使ってみる

2021/11/07に公開

AWSを使う必要が出てきたので、色々と試してみる。
ここでは、CodePipeline を試す。

AWS CodePipeline

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/welcome.html

CodePipelineとはアプリをデプロイするために必要なステップを、可視化・自動化できるやつ。
いわゆるCIツールのたぐい。

大まかに何が出来るのかを知りたい場合は、この動画がすごく分かりやすくて良い。

Introduction to AWS CodePipeline - Continuous Delivery on Amazon Web Services - YouTube
https://www.youtube.com/watch?v=YxcIj_SLflw

パイプライン

一連の処理の流れ。
パイプラインは複数のステージで構成される。

パイプライン内の処理を定義するには、UIから手動で行うか、CloudformationでStackを定義して行う形になるらしい。
一般的なCIツールのように、Git管理されたyamlを元に処理を定義する、みたいなことはできない雰囲気。

ステージ

処理を実行する環境の単位。
各ステージ毎にコンテナを立ち上げて処理する感じ。
ステージは複数のアクションで構成される。

アクション

実際に行われる処理の単位。
ソースコードを取ってきたり、テストしたり、デプロイしたり。

アクションにはタイプというものがある。

  • source
  • build
  • test
  • deploy
  • approval

があり、各タイプに対応するプロバイダーというものをアクションに設定する。

で、各プロバイダーに応じて行える処理の内容が変わってくる。
CodeBuildなどを選択すれば、その中で任意の処理を行えたりする。

また、ステージ内のアクションは直列だけでなく並列に並べることも出来る。

ECSにデプロイするパイプラインを作成してみる

前回は、ECSを使ってみた。
そこで、ECSに対してデプロイするパイプラインを作成してみる。

パイプラインを作成する

まずは、パイプラインを作成する。

source stage では GitHub(Version2) を選択し、デプロイ用のリポジトリを指定する。

build stage では CodeBuild を選択し、同時にプロジェクトを新規作成する。
CodeBuildで実行する内容は GitHub に buildspec.yml を配置することで定義できる。

一旦、deploy stage はスキップする。

作成されるとこんな感じになる。

ECRにリポジトリを作成する

デプロイするDockerイメージを管理するための、ECRリポジトリを作成する。
名前は、"mynginx"とでもしておく。

ECRにDockerイメージを上げる

パイプラインに設定したCodeBuildから、デプロイ対象のDockerイメージをECRへと上げてみる。

まず、作成したCodeBuildに紐付いているIAMロールに対して、ECRにイメージを上げるための権限を付与する。
とりあえず、ECRに対するREAD/WRITE権限をインラインポリシーとしてアタッチしておけばひとまずOKなはず。

そして、Dockerfileとbuildspec.ymlを用意する。

Dockerfile
FROM nginx:latest
COPY html /usr/share/nginx/html
buildspeck.yml
version: 0.2

env:
  variables:
    AWS_DEFAULT_REGION: ap-northeast-1
    AWS_ACCOUNT_ID: xxxxxxxxxxxx
    IMAGE_REPO_NAME: mynginx
    IMAGE_TAG: latest

phases:
  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
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG

Dockerイメージをビルドする場合は、CodeBuildで使用するイメージの設定を変更する必要があるらしい。
なので↓をチェックする。

これで、git push すれば自動的にパイプラインが動き始める。
そして、ECRにDockerイメージが上がる。

ECSにデプロイする

最後に、先程のDockerイメージをECSへとデプロイする。

ECSクラスター周りは事前に作成しておく。
タスク定義ではECRのnginx:latestをイメージ指定しておく。

パイプラインにDeployステージを追加し、AmazonECSプロバイダーでアクションを設定する。
Blue/Greenしたい場合はAmazonECS(Blue/Green)の方を設定することになるが、ここではシンプルにデプロイできる方で試す。

AmazonECSプロバイダーではimagedefinitions.jsonがInput artifactsに含まれている必要があるため、BuildArtifactを指定し、次のようにbuildspec.ymlを更新しておく。

buildspec.yml
version: 0.2

env:
  variables:
    AWS_DEFAULT_REGION: ap-northeast-1
    AWS_ACCOUNT_ID: xxxxxxxxxxxx
    IMAGE_REPO_NAME: mynginx
    IMAGE_TAG: latest

phases:
  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
      - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
  post_build:
    commands:
      - IMAGE_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $IMAGE_URI:IMAGE_TAG
      - docker push $IMAGE_URI:IMAGE_TAG
      - echo "[{\"name\":\"mynginx\",\"imageUri\":\"$IMAGE_URI\"}]" > imagedefinitions.json

artifacts:
  files:
    - imagedefinitions.json

これで、Buildステージでimagedefinitions.jsonが生成され、Deployステージで参照出来るようになる。

Dockerイメージに含めるHTMLファイルを適当に更新し、pushする。
これで、パイプラインが起動し、自動的にECSへとデプロイされるはず。

パイプラインが無事終了し、新しいHTMLでWebページが開けた。

まとめ

AWSの各種サービスと連携するのが非常に簡単なのは良い点。
今度はBlue/Greenデプロイも試してみたい。

Discussion