AWSが公開しているAWS 初心者向けハンズオンでは、AWSアカウントの作り方から始まりサーバレスアーキテクチャで翻訳Web APIを構築したり、CloudFormationでWebシステムを構築したり、と様々なAWSサービスを利用したハンズオンが掲載されており、実際に手を動かして知識を深めることができます。
今回はその中からAWS Code サービス群を活用して、CI/CD のための構成を構築しよう!を実際に構築し、挙動を確認していきます。
アーキテクチャ図
利用しているAWSサービス
AWS CodeCommit
- フルマネージド型のソース管理サービス
- 既存のGitツールともシームレスに連携できる
AWS CodeBuild
- フルマネージド型のビルドサービス
- ソースコードのコンパイル、テスト実行、デプロイ可能なソフトウェアパッケージの作成が可能
※フルマネージドなのでビルド用のサーバの管理が不要となる
AWS CodeDeploy
- EC2, Lambda、オンプレ環境などに対してデプロイを行う
- AutoScalingする攻勢に対しても、連動して自動でデプロイする
- インプレース、canary、ブルー/グリーンデプロイなど、複数のデプロイタイプをサポート
AWS CodePipeline
- 上の3つのサービスを統合する
- ソースコードの変更をトリガにビルド、デプロイといった一連の流れを自動的に実行する
AWS Cloud9
2024/12/17時点でCloud9は新規利用が制限されているため利用ができません。
代わりにAWS管理コンソール上から利用できるCloudShellを利用してCodeCommitへのgitコマンド発行を行います。
構築(ポイントとなる箇所のみ)
s3(静的Webサイトホスティング用)
s3はデフォルトで静的Webサイトホスティングが無効となっているため、有効に設定します
ブラウザからS3バケット内のリソースへのアクセスを許可するための「バケットポリシー」を設定します
ポリシーの生成には「ポリシージェネレータ」を使用すると、GUIで簡単にポリシーを作成することができます。
s3(CodeBuild用)
CodeBuildでビルドした際の成果物であるアーティファクトを格納するためのs3バケットを作成する。
CodeBuild
ビルド結果のアーティファクトをCodeDeployに渡す必要があるため、CodeBuildに設定しているロールに対して「AWSCodeDeployDeployerAccess」ポリシーをアタッチします。
ビルド用の設定はyamlファイルで記述してCodeCommitのリポジトリのトップに配置しておきます。
version: 0.2
phases:
build:
commands:
- aws deploy push --application-name h4b-app --s3-location s3://codepipeline-artifact-20241218/artifact.zip --source src
artifacts:
files:
- '**/*'
base-directory: src
CodeDeploy
デプロイ対象のEC2インスタンスの設定などを「アプリケーション」という単位で設定します。
設定もyamlファイルで記述し、CodeCommitに登録します。
version: 0.0
os: linux
files:
- source: index.html
destination: /var/www/html/
CodeCommit
CloudShellからCodeCommitに対してgitコマンドを発行するために、CloudShell上で接続設定を行います。
接続にはAWS CLI 認証情報ヘルパーを利用します。
認証情報ヘルパーを利用した接続は以下の通りとなります。
CloudShellからはファイルのアップロードもできるため、gitリポジトリに静的Webサイトホスティングで使用するindex.htmlファイルをアップロードし、CodeCommitにgit pushします。
CodePipeline(EC2へのデプロイ用)
CodeCommitに変更が生じたときにCI/CDを自動的に動かすように設定します。
変更の検知はCloudWatchを使用(デフォルト)します。
CodePipelineの作成ではソース、ビルド、デプロイでそれぞれ何を使うのかを選択できますので、
上で作成したものを設定します。
EC2
CodeDeployを利用するためにはデプロイ先のEC2に対してCodeDeployエージェントをインストールする必要がある。
EC2インスタンスを起動し、EC2 Instance Connectで接続した後に上のURLの手順に従ってCodeDeployエージェントをインストールする。
動作確認のためにhttpdサーバをインストールし、起動しておきます。
yum install httpd -y
systemctl start httpd.service
systemctl enable httpd.service
動作確認
s3へのデプロイを行うCodePipeline
s3のバケットに登録したindex.htmlを静的ウェブサイトホスティングのURLから開きます。
Cloud Shellでindex.htmlの内容を修正。修正後はCodeCommitにgit pushを実行します。
※CodePipelineの機能により、CodeCommitへのpushを検知してs3にファイルがデプロイされる
再度s3の画面を開くと文字列が変更されていることがわかります。
EC2へのデプロイを行うCodePipeline
- index.htmlを更新してCodeCommitにgit push
- CloudWatchが更新を検知
- CodeBuildがリポジトリからファイルを取得してビルド
- CodeDeployがアーティファクトをEC2にデプロイ
- EC2上でhttpdサーバが動作しているので、更新されたindex.htmlが表示
という流れを確認したいと思います。
実際は1と5のみ手動で実施し、2~4は自動で動くことになります。
まずindex.htmlの文字列を以下のように修正します。
<html>
<body>
Good Morning Auto CodePipeline World!!!
</body>
</html>
CodePipelineを見ると2~4の処理が走って、成功していることがわかります。
EC2のパブリックIPアドレスを確認すると更新後のindex.htmlが表示されていることが確認できます。
感想
AWS Codeサービス群を使ったCI/CDの構築を実施してみました。
ビルド対象がhtmlファイル1つだけだったのでビルドやデプロイのコードは非常に簡素なものでしたが、簡単な設定でCodePipelineの自動化がサーバレスに実施できることが確認できました。
より複雑なビルド構成についてもリファレンスを参考にしつつ確認していけたらと思います。
それでは今回はこの辺で。