CodePipelineを step by step でやってみた

2021.06.09

この記事では、CodePipelineを実践するにあたってCodeCommit、CodeBuild、CodeDeployを順に行います。最後にそれぞれをCodePipelineから呼び出します。

CodeCommit

IAMユーザの作成

リポジトリをcloneするユーザを作成します。

IAM → ユーザ追加 →既存のポリシーを直接アタッチ → AWSCodeCommitPowerUserを指定し、ユーザを作成する

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-08_16.41.44.png

作成した、ユーザの認証情報を開き、AWS CodeCommitのHTTPS Git 認証情報を生成します。

生成されたユーザ名、パスワードをメモします。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled.png

リポジトリの作成

CodeCommitのリポジトリより新規のリポジトリを作成します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-08_16.36.12.png

作成後、下記のような画面となりますので、

URLのクローン → HTTPSクローンを選択し、URLをコピーします。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled-1-1.png コマンドラインにて下記を実行します。

git clone コピーしたURL

すると、認証情報が求められますので、先ほどメモした認証情報を入力します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled-2-1.png

認証後リポジトリがクローンされます。

pushする

クローンしたリポジトリ内にappspec.yml、buildspec.yml、main.py、build.py、env_create.sh、run.shを準備します。 ファイルは、下記より利用しました。

demo-codecommit
├── appspec.yml
├── build.py
├── buildspec.yml
├── env_create.sh
├── main.py
└── run.sh

また、GitHubのリモートリポジトリも作成を行い、

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.26.49.png

下記コマンドで追加します。

git remote add github githubリポジトリのURL

その後、下記コマンドを実行し、各リポジトリにpushを行います。

git add .
git commit -m "first commit"
git push origin master
git push github master

すると、CodeCommitのリポジトリにファイルが追加されていることが確認できます。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_9.51.37.png

CodeBuild

続いてCodeBuildを行います。

まずは、ビルドプロジェクトを作成します。

ソースには先ほど作成したCodeCommitのリポジトリを指定します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_9.54.06.png

環境については、Amazon Linux2を使用します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_9.54.52.png

他の設定はデフォルトとして作成を行います。作成後以下の画面となるので、ビルドの開始を選択します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled-3.png

ビルドが始まるとログが表示され、ステータスが成功となれば問題ありません。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_9.59.14.png

CodeDeploy

IAMロールの作成

AWSCodeDeployRoleをアタッチしたCodeDeploy用のIAMロールを作成します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled-4-1.png

続いて、デプロイ対象であるEC2用のIAMロールを作成します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.09.33.png

EC2の作成

Amazon Linuxを指定しインスタンスの作成を行います。

IAMロールは先ほど作成したものを指定します。

ユーザデータには、CodeDeployエージェントをインストールするようにこちらにあるコードを貼ります。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.13.45.png

タグでNameを任意の名前で設定します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.15.59.png

さらにセキュリティグループについては、ssh接続ができるように指定し、作成まで進めます。

CodeDeployの設定

アプリケーションの作成を行います。

今回はEC2を指定します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.00.28.png

続いて、デプロイグループの作成を行います。

サービスロールには、CodeDeploy用のIAMロールを指定します。

デプロイタイプはインプレースとします。

環境設定では、先ほど作成したEC2インスタンスのNameを指定します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled-5.png

Loadバランサーは無効にし、作成をします。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.23.16.png

下記のような画面となるので、デプロイを作成を選択します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/8638869f264d0746a66967c4f3dd1558.png

リビジョンタプをGitHubで指定し、GitHubでのメールアドレスを入力します。 その後、GitHubのリポジトリ名、コミットIDを入力し、デプロイの作成を行います。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.33.33.png

するとデプロイが開始され、成功すると以下のような画面となります。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.34.47.png

CodePipeline

最後に、今までのCodeCommit、CodeBuild、CodeDeployを繋げます。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled-6.png

新しいサービスロールを指定し、次に進みます。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.38.47.png

ソースには、先ほどCodeCommitを指定します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.40.04.png

ビルドも作成したプロジェクトを指定します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.40.28.png デプロイも先ほどのアプリケーションを指定し、パイプラインの作成を行います。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.41.16.png すると、このようにパイプラインが実行されていきます。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.42.39.png

正常に進むと以下のようになります。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-09_10.45.28.png

再度内容を変更しpushする

main.pyを以下のように変更します。

import requests
from bs4 import BeautifulSoup

# Get
res = requests.get('https://dev.classmethod.jp/')

# Parse
soup = BeautifulSoup(res.text, 'html.parser')

# title
title = soup.find('title').text

print(title)

変更後下記コマンドを実行し、再度pushします。

git add main.py
git commit -m "main.py fix"
git push origin master

すると、CodePipelineも再度実行が始まります。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled-7.png

EC2に接続し、ログ(scripts.log)を確認すると、正常に変更されていることが確認できます。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled-8.png

最後に

コードをホスティングし、自動的にビルド、テストして、AWSにデプロイという流れを一通り体験しましたが、非常に便利だと感じました。

今回は、EC2にデプロイを行なってみましたが、他にLambdaやECSにもデプロイ可能です。