AWS入門 - CodePipeline 使ってみる
AWSを使う必要が出てきたので、色々と試してみる。
ここでは、CodePipeline を試す。
AWS CodePipeline
CodePipelineとはアプリをデプロイするために必要なステップを、可視化・自動化できるやつ。
いわゆるCIツールのたぐい。
大まかに何が出来るのかを知りたい場合は、この動画がすごく分かりやすくて良い。
Introduction to AWS CodePipeline - Continuous Delivery on Amazon Web Services - YouTube
パイプライン
一連の処理の流れ。
パイプラインは複数のステージで構成される。
パイプライン内の処理を定義するには、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を用意する。
FROM nginx:latest
COPY html /usr/share/nginx/html
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を更新しておく。
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