AWS Code兄弟を触ってみた
AWS Code兄弟を触ってみたということで
今日行ったハンズオンは以下になります。
AWS Hands-on for Beginners - AWS Code サービス群を活用して、CI/CD のための構成を構築しよう!
Code兄弟の概要
※code兄弟(code4兄弟)はCodeCommit, CodePipeline, CodeBuild, CodeDeployを総称した名称になります。AWSでCI/CDパイプラインを構築するためのサービス群です。
以下は各サービスのざっくりとした概要になります。
- CodeCommitはgithubのaws版。バージョン管理ツール
- CodeBuildはビルド・テストを通じてデプロイ可能なソフトウェアパッケージ(artifact)を作る役目を持ったサービス
- CodeDeployはデプロイを通じてCodeDeployのリソース(application)を作る役目を持ったサービス
- CodePipelineはCodeCommit->build->deployを自動化するサービス
無料枠でできること
CodeCommit: 無料枠だと5ユーザーまで無料、1000リポジトリの作成が無料で作れます。
CodeBuild: 1 か月あたり100分の総ビルド時間
CodeDeploy: サービス自体に料金はなし。
CodePipeline: アクティブなパイプライン一つまで無料。
※CodePipelineの無料枠が乏しいことから個人開発であればCodePipelineよりもGithub Actionsを使ってる記事が多く見受けられました。
ハンズオンの設計図
初めて知った用語
Artifact: CodeBuildの成果物。最終的に作られるパッケージの名称。
CodeDeploy Agent: CodeDeployでデプロイ先となるec2に必要なパッケージソフト
CodeCommit 認証ヘルパー: 外部環境からCodeCommitのリポジトリに接続するためのgit configの設定
フェーズ1の流れ
フェーズ1ではs3にホストされてる静的webサイトにCI/CDパイプラインを組み込む流れになります。
- S3バケットを作成する
- パブリックアクセスをブロックしない
- bucketポリシーを追加
- 静的webホスティングを有効化, デフォルトドキュメントをindex.htmlに設定
- CodeCommitを作成する
- リポジトリを作成
- Cloud9を作成する
- CodeCommitのリポジトリに接続するために認証ヘルパーを設定する
- gitのname, emailの設定をする
- CodeCommitリポジトリをクローンする
- index.htmlファイルを追加し、git add, commit, pushをする
- 静的ホスティングURLを表示し、index.htmlの内容が反映してることを確認する
# 認証ヘルパーの設定
$ git config --global credential.helper '!aws codecommit credential-helper $@'
$ git config --global credential.UseHttpPath true
# gitのusernameの設定${name}はお好きな名前
$ git config --global user.name "${name}"
# gitのemailの設定${email}はお好きなメールアドレス
$ git config --global user.email "${email}"
- CodePipelineを作成する
- ソースはCodeCommitのリポジトリを選択
- ビルドステージをスキップ
- デプロイ前にファイルを抽出するを有効化(現時点では目的は不明。有効化するとパイプラインを回したときに
codepipeline-ap-northeast-1-xxxxxxx
というS3バケットが作成される) - デプロイプロバイダーはs3の静的webサイトのバケットに設定
※パイプラインはサービスロール(IAMRole)が必要で、CodePipiline作成時に自動的に作成される
フェーズ2の流れ
フェーズ2ではEC2にホストされてる静的webサイトにCI/CDパイプラインを組み込む流れになります。
# フォルダ構成
.
├── buildspec.yml
└── src
├── appspec.yml
└── index.html
- EC2を作成する
- IAMRoleを設定(s3fullaccessポリシー)
- httpdをインストールして起動する
- CodeDeployを使うためにエージェントをインストールする
- CodeBuildを作成する
- artifact用のs3バケットを作成する
- ビルドプロジェクトを作成する(artifactは先ほどのバケットを追加する
- 自動で作られたIamRoleにAWSCodeDeployDeployerAccessポリシーを追加する
- buildspec.ymlを作成する。詳細な書き方はリファレンスを参照
# ${xxx}は自分用に置き換える
version: 0.2
phases:
build:
commands:
- aws deploy push --application-name ${CodeDeployのApplication名}
--s3-location s3://${s3のartifactバケット名}/artifact.zip
--source src
artifacts:
files:
- '**/*'
base-directory: src
- CodeDeployを作成する
- IAMRoleを作成する。(サービス:CodeDeploy, ポリシー:AWSCodeDeployRole)
- アプリケーションを作成
- デプロイグループを作成
- 先ほどのIAMRole
- 環境設定で対象のec2インスタンスを選択
- agentの設定は無効(手動で設定したので)
version: 0.0
os: linux
files:
- source: index.html
destination: /var/www/html/
# 今回は使わないがhooksを使用するとデプロイの前後にイベントを仕込むことができる
- CodePipelineを作成する
- ソースプロバイダ: CodeCommit
- ビルドステージ: CodeBuild
- デプロイプロバイダー: CodeDeploy(application名, デプロイグループを選択)
-
$ git push origin master
をしてCodePipelineが走るか検証する
※CodePipelineを作成したタイミングで一度パイプラインが回る
リソースの削除
- cloud9の環境を削除
- ec2 を削除
- codepipelineを2つ削除(s3用とec2用)
- codecommitのリポジトリを削除
- codebuildのビルドプロジェクトを削除
- codedeployのアプリケーションの削除
- s3の削除
- codepipelineの設定でデプロイ前にファイル抽出されたバケット
- codebuildのartifactのバケット
- s3のwebホスティング用のバケット
まとめ
業務では必須のCI/CD環境を1から構築してみた。artifactなどサービス独自の呼称だったり認証ヘルパーの設定などは自分で調べると時間がかかる内容だが、ハンズオンなのですんなり理解することができた。ただしCodePipelineの無料枠が一つなので実際に個人開発する際はGithub ActionsでCI/CDを構築しようと思った。
時間があれば今回のCI/CD環境をCloudFormationでコード化してみたい。
Discussion