GitHubからAWSにCodePipelineとCodeDeployで資材を配置してみる
概要
GitHub から AWS に対して CodePipeline と CodeDeploy を用いて、EC2 に資材を配置(自動デプロイ)してみます。
まずは、ビルドの必要のないアプリケーション(HTML など)のインプレース(単純ファイル置き換え)での EC2 へのデプロイ構成になります。
手順
EC2 用 IAM ロールの作成
EC2 に対して、CodeDeploy に対する接続権限を与えるためのロールを作成します。
-
IAM
-ロール
-ロールを作成
を選択します。 -
ユースケース
-一般的なユースケース
-EC2
を選択し、次へ
を押下します。 -
AWSCodeDeployRole
を選択して、次へ
を押下します。 -
ロール名
に任意の名前を設定します。(例:codedeployrole
)
CodeDeploy 用 IAM ロールの作成
CodeDeploy に対して付与するロールを作成します。
-
IAM
-ロール
-ロールを作成
を選択します。 -
ユースケース
-他の AWS のサービスのユースケース
-CodeDeploy
を選択し、次へ
を押下します。 -
AWSCodeDeployRole
が表示されていることを確認します。 -
AmazonS3FullAccess
を追加で設定します。 - そのまま
次へ
を押下します。 -
ロール名
に任意の名前を設定します。(例:codedeploy-servicerole
)
EC2 の作成
先ほど作成した IAM ロールを紐づける形で EC2 を作成します。
-
EC2
-インスタンス
からインスタンスを起動
を選択します。 -
Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
を選択します。(無料利用枠の最新版を選択。何でもよいです) -
t2.micro
を選択します。(無料利用枠のものを選択。何でもよいです) - インスタンスの詳細を設定します。
- 任意のネットワーク、サブネットを選択します。但しインターネットから接続が可能であることが必要です。
-
自動割り当てパブリックIP
が有効
であることを確認します。 -
IAMロール
で先ほど作成したロールを選択します。(例:codedeployrole
) -
次のステップへ
を押下します。
- ストレージの追加設定
- 何もせず
次のステップへ
を押下します。
- 何もせず
- タグの追加設定
-
タグの追加
を押下し、以下の設定を追加します。-
キー
:Name
、値
:CodeDeployDemo
を追加します。 -
キー
:deploy
、値
:01
を追加します。※この値は何でもよいですが、後程デプロイ対象の特定に用います。
-
-
次のステップへ
を押下します。
-
- セキュリティグループの設定
- デフォルトで 22 番ポートが
0.0.0.0/0
(すべて)から接続可能になっていることを確認します。 - 追加で 80 番ポート(HTTP)を、
0.0.0.0/0
(すべて)から接続可能に設定します(デプロイ後の Web サーバ動作をブラウザで確認する場合) -
確認と作成
を押下します。
- デフォルトで 22 番ポートが
- 確認~作成
- 作成するインスタンス内容を確認し、
起動
を押下します。 -
キーペア
を選択し、チェックボックスにチェックを入れてインスタンスの作成
を押下します。
- 作成するインスタンス内容を確認し、
CodeDeployAgent のインストール
- EC2 インスタンスに SSH で接続します。
-
ssh -i [キーファイル(xxx.pemファイル)のパス] ec2-user@[EC2インスタンスのパブリックIPアドレス]
※TeraTerm からの接続でも OK
-
- AWS 公式ドキュメントに従って CodeDeployAgent をインストールします。
参考(1)
実行したインストール手順
ssh -i [キーファイル(xxx.pemファイル)のパス] ec2-user@[EC2インスタンスのパブリックIPアドレス]
sudo yum update
sudo yum install ruby
sudo yum install wget
cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
確認手順
sudo service codedeploy-agent status
以下の内容が表示されれば OK です。
確認結果
The AWS CodeDeploy agent is running as PID 3666
参考(2)
AWS 公式ドキュメントでは現在、上記手順コマンドラインによる手順より、AWS Systems Manager
を用いたインストールが推奨されています。
試せていませんが、AWS Systems Manager
を使用する手順を試してみたほうが良いかもしれません。
※初期セットアップがもろもろ必要そうです。
GitHub リポジトリの作成
GitHub にてリポジトリを作成しておきます。
例:リポジトリ名:codedeploytest
ローカルリポジトリの作成~初回プッシュ
ローカル環境で Git リポジトリを初期化して Remote に追加しておきます。
ローカルのパス(例):/home/[ユーザ名]/codedeploytest/
cd ~
mkdir codedeploytest
cd codedeploytest
touch README.md
git init
git add README.md
git commit -m "My first commit"
git branch -M main
git remote add origin https://github.com/[ユーザ名]/codedeploytest.git
git push -u origin main
※GitHub リポジトリ URL は作成したリポジトリを設定してください。
※GitHub のユーザ名、E-mail、Personal Access Token などは必要に応じて設定します。
CodeDeploy 用サンプル資材の入手
AWS が用意している CodeDeploy 用のサンプル資材がありますので、その資材を入手します。
以下のページを参考に、資材を取得してローカルディレクトリに展開し、GitHub にプッシュします。
参考:実施した手順
aws s3 cp s3://aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Linux.zip . --region ap-northeast-1
unzip SampleApp_Linux.zip
rm SampleApp_Linux.zip
git add .
git commit -m "Added sample app"
git push
※aws
コマンドを通すために、AWS CLI を事前にインストールしておく必要があります。AWS CLI インストール手順は以下を参考にしてください。
参考:CodeDeploy のファイル配置の仕様
デプロイの動作定義(appspec.yml)
ルートディレクトリ直下に必ずappspec.yml
ファイルを配置する必要がある。
version: 0.0
os: linux
files:
- source: /index.html
destination: /var/www/html/
hooks:
BeforeInstall:
- location: scripts/install_dependencies
timeout: 300
runas: root
- location: scripts/start_server
timeout: 300
runas: root
ApplicationStop:
- location: scripts/stop_server
timeout: 300
runas: root
-
files
で同期させる元ファイル(source
)と、配置先を定義(destination
)を設定する。 -
hooks
で CodeDeploy 実行時の任意の合間に実行する処理を定義する。 -
ApplicationStop
は既存のアプリが停止したときに動作する(初回は動かない)
CodeDeploy の設定
AWS コンソールに接続し、CodeDeploy の設定を行います。
- AWS コンソールで、
CodeDeploy
-デプロイ
-開始方法
-アプリケーションの作成
を選択します。 -
アプリケーションの作成
で次の設定を行います。- アプリケーション名:任意の名前を設定します。(例:
test-codedeploy
) - コンピューティングプラットフォーム:
EC2/オンプレミス
を選択します。 -
アプリケーションの作成
を押下します。
- アプリケーション名:任意の名前を設定します。(例:
- アプリケーションの作成を行ったら、続いてデプロイグループの作成を行います。
-
デプロイグループの作成
を押下します。 -
デプロイグループの作成
で次の内容を設定します。- デプロイグループ名:任意の名前を設定します。(例:
test-deploygroup
) - サービスロール:事前に作成したサービスロールを選択します。(例:
codedeploy-servicerole
) - デプロイタイプ:
インプレース
を選択します。 - 環境設定:
Amazon EC2 インスタンス
を選択します。 - タググループ:
キー
:deploy
、値
:01
を設定します。※EC2 作成時に設定したデプロイ対象特定用のタグを設定します。 - AWS Systems Manager を使用したエージェント設定:AWS CodeDeploy エージェントのインストールは
今すぐ更新し、更新をスケジュール
のままとします。ベーシックスケジューラも14日間
のままとします。 - デプロイ設定:
AllAtOnce
のままとします。 - Load balancer:今回はロードバランサを使用していないのでチェックを外します。
-
デプロイグループの作成
を押下し、作成を実行します。
- デプロイグループ名:任意の名前を設定します。(例:
-
- 単体でデプロイを実行してみます。
- 対象のデプロイグループで
デプロイの作成
を押下します。 -
リビジョンタイプ
を、アプリケーションは GitHub に格納されています
を選択します。 -
GitHub トークン名
で GitHub アカウント名を指定し、GitHubに接続する
を実行します。 -
リポジトリ名
について、GitHub で作成したリポジトリを`[アカウント名]/[リポジトリ名]で設定します。 -
コミットID
について、GitHub からコミット履歴を確認し、最新のコミット ID を確認して設定します。 -
デプロイの実行
を押下します。
- 対象のデプロイグループで
うまくいけば、デプロイのステータスが「成功」になります。
サーバにコンソール接続し/var/www/html/index.html
ファイルが配置されていれば OK です。
補足:GitHub の OAuth トークンがエラーとなり削除したい場合
コンソール画面から削除することができません。次の方法で削除し、再登録します。
一覧確認
aws deploy list-git-hub-account-token-names
削除実行
aws deploy delete-git-hub-account-token --token-name <GitHubアカウント名>
CodePipeline の設定
続いて、GitHub に Push したら自動デプロイされるように CodePipeline を構成していきます。
- AWS コンソールで
CodePipeline
を開きパイプラインを作成する
を押下します。 - パイプラインの設定を行います。
- パイプライン名:任意の名前を設定します。(例:
test-pipeline
) - ロール名は自動で作成されるので、
次に
を押下します。 - ソースプロバイダーとして
GitHub(バージョン2)
を選択します。 -
接続する
を押下し、任意の接続名
を設定します。(例:GitHubConnection
) - 接続を行い、GitHub 側の画面で認可を行います。
-
新しいアプリをインストールする
を選択し、連携対象のリポジトリを選択します。 -
接続
ボタンを押下します。 -
リポジトリ名
から、対象のリポジトリを選択します。(既に接続済みのものから選択できます) -
ブランチ名
から、main
を選択します。 -
出力アーティファクト形式
はCodePipeline のデフォルト
を選択します。 -
ビルドステージを追加する
は、ビルドステージをスキップ
を選択します。 -
デプロイプロバイダーの選択
で、AWS CodeDeploy
を選択します。 -
アプリケーション名
、デプロイグループ
については、事前に作成したものを選択します。(test-codedeploy
、test-deploygroup
) - 確認画面で、内容を確認し、
パイプラインを作成する
を押下します。
- パイプライン名:任意の名前を設定します。(例:
ここまでで設定は終了です。
動作確認
GitHub に HTML 資材を変更し PUSH を行います。
PUSH をトリガとして CodePipeline と、CodeDeploy が動作し、資材が Web サーバに配置されます。
次のような画面が非表示されます。(文字色を少し変更してみている)
所感
今回はまだ、CodeBuild 等は使っていない、ビルドレスのアプリケーションのインプレースでのデプロイまでをやってみました。
実際にはビルド連携や、Blue/Green デプロイといった考慮も必要になってきますので、そのあたりもやっていければと思います。
Discussion