はじめに
昨今、システム開発のインフラ部分において、DevOps、インフラのコード化やCICD環境の構築が必須となってきました。また、人気資格であるAWS認定のDVA(developer associate)において、CICDを構築するCodeシリーズについての出題が頻出です。
上記を踏まえて、以下のような方はこの記事で、AWS Codeシリーズを用いて、CICD環境構築における入門的な内容を実践していただけたらと思います。
- 業務で以下のようなツールを用いたCICD環境構築をする要件がある
- jenkins、circleCI、GitLab、AWS CodePipeline
- AWS DVAの取得を目指酢関係で、AWS Codeシリーズの理解が必要である
AWS公式ハンズオンを利用する
今回は、無料のハンズオンセミナーを利用して、Codeシリーズの使用方法を抑えていきます。
AWS公式のHands-on for Begginersシリーズは、サービス知識の無い方向けに作成されているようで、概要の説明からハンズオン手順まで非常に分かり易く解説されております。
ですので、初めて利用するサービスを会社の開発環境などでいきなり構築する前に、入門しておきたい場合などに非常に有効です。
使用するサービス
以下のサービスを使用します。
CodeCommit
- フルマネージド型のソースコード管理サービス
- サーバーを用意する必要がない
CodeBuild
- フルマネージド型のビルドサービス
- ビルド:ソースコードをコンパイル、テストしてデプロイできる状態にすること
- サーバーを用意する必要がない
CodeDeploy
- EC2やオンプレ環境のサーバーなどに対してデプロイする機能を提供するサービス
- デプロイ:アプリケーションを利用できる環境にアップロードすること
CodePipeline
- フルマネージド型の継続的デリバリーサービス
- 継続的デリバリー:ソースコードの変更を起因にビルド、デプロイの流れを自動的に実行すること
パターン1「S3で静的ウェブサイトホスティングを使用する例」
手順に従い進めていきます。
時間の無い方で、ある程度AWS知識のある方向けに、簡易的に手順を記載します。詳細は公式資料をご確認いただくことで理解が深まるかと思います。
またつまづいた点、気づきのあった点が参考になれば幸いです。
S3バケットの作成
- S3バケットの作成
- 任意のバケット名を入力
- 世界で一意しか受け付けない点に注意
- パブリックアクセスを有効にして、アラート箇所にチェックすることに注意
- 他の設定は触らない
静的ウェブサイトホスティングの有効化
- 静的ウェブサイトホスティングを有効にする
- インデックスドキュメントに”index.html”と入力する
バケットポリシーの許可設定
- バケットポリシーを編集から、以下の通り、オブジェクトへのgetリクエストを許可するポリシーを追加する
- オブジェクト:バケット内に保存するデータのこと
オブジェクトをアップロード
- アップロードを選択
ファイルを追加>アップロードを選択
プロパティ>静的ウェブサイトホスティング>パブリックウェブサイトエンドポイントを選択
index.htmlの内容が表示される
CodeCommitの設定
リポジトリを作成
Cloud9で開発環境を作成
- 任意の名前を入力して、環境を作成を選択
- タイムアウト項目で、時間経過によりEC2を停止できる
- Cloud9の実態はEC2であり、起動時間で従量課金される
- なしを選べば、停止されない
Cloud9の設定変更
- soft tabs を2に設定する
以下のコマンドを実行してAWS認証ヘルパーを使用する
git config --global credential.helper '!aws codecommit credential-helper $@' git config --global credential.UseHttpPath true
- 以下のコマンドを実行して、gitのユーザーとメール設定をする
- 任意のアカウントで設定する
git config --global user.name "xxx"
git config --global user.email "xxx@example.com"
CodeCommitの作成したリポジトリからcloneコマンドをコピーして実行する
git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/sample-code-001
中身がないので以下のようになる
Cloning into 'sample-code-001'...
warning: You appear to have cloned an empty repository.
ディレクトリを移動
cd sample-code-001
index.htmlをアップロード
- 以下のコマンドでpushまで進める
- git add -A:コミットする対象をカレントディレクトリ内の全て(-A)とする
- git commit:変更を確定する
- git push:コミットした内容をCodeCommitのリポジトリにアップロードする
git add -A
git commit -m "init"
git push origin master
以下のように、CodeCommit内のリポジトリを更新すると、pushした内容が反映されていることがわかる
CodePipelineの設定
パイプラインの設定
ソースの指定
ビルドステージはスキップする
デプロイステージには、作成したS3を指定する
- デプロイする前にファイルを抽出するにチェック
レビュー画面でパイプラインの作成を選択
- しばらくすると作成が完了する
パイプラインの動作検証
コードに変更を加えてpushする
- コードに変更を加える
- 9行目に”Code”を加えた
- 変更を保存する
- macbookなら「command+s」
- Windowsなら「control+s」
- 以下のコマンドでpushまで進める
- git commit -m “任意の文字列”:コミットメッセージと呼ばれ、コミット単位にコメントを残せる
git add -A
git commit -m "add string"
git push origin master
CodePipelineの動作を確認
- CodePipelineがCodeCommitの変更を検出する
S3内のindex.htmlが変更されていることがわかる
パターン2「EC2にデプロイする例」
IAMロールの作成
EC2にアタッチするIAMロールを作成する
- IAMを開き、ロールを付与する対象にEC2を選択
- 任意のロール名を入力
- 許可するポリシーはAmazonS3FullAccess
- ロールを作成を選択
EC2インスタンスを起動する
アプリケーションのデプロイ先EC2インスタンスを起動する
- EC2を開き、インスタンを起動を選択
- 以下の項目のみ変更を加える
- ほかの設定項目が多いが、デフォルトのまま変更しない
名前とタグ>任意の名前を入力
キーペア(ログイン)>キーペアなしで続行を選択
ファイアウォール>セキュリティグループを新たに作成で進める
- デフォルトでSSHを許可するルールがあるので2つ目を追加する
- 全てのソース(0.0.0.0/0)からHTTPを許可するルール
- インスタンスの起動を選択
インスタンスの起動と接続
- しばらくすると実行中のステータスのインスタンスが表示される
- EC2を選択して、画面上の接続を選択
- EC2インスタンスに接続>EC2InstanceConnect>接続を選択
EC2に接続できる
Webサーバーとしての設定とCodeDeployAgentのインストール
- 以下のコマンドを実行
- webサーバーとしての設定
- httpdをインストール
- CodeDeployを使用するためにエージェントをインストール
- https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html
- wgetコマンドについては、こちらに従い適切に指定する
- 東京リージョンの場合のコマンド例:wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install
sudo yum update
sudo yum install httpd -y
sudo systemctl start httpd.service
sudo systemctl enable httpd.service
sudo yum install ruby -y
sudo yum install wget -y
cd /home/ec2-user
wget https://bucket-name.s3.region-identifier.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status
Artifact用のS3バケットを作成
S3バケットの作成
- 任意のバケット名を入力してバケットを作成
- 他の項目は変更しない
- パブリックアクセスもブロックしたままにしておく
CodeBuildの設定
- 以下の手順に従い設定を進める
- 後述で挙げている項目以外はデフォルト設定から変更しない
ビルドプロジェクトを作成する
プロジェクトの設定とソースの指定
- 任意のプロジェクト名を入力
- ソースプロバイダはCodeCommitを選択
- リポジトリは作成したものを指定
- リファレンスタイプはブランチ
- ブランチはmaster
環境の設定
- オペレーティングシステムから環境タイプまで以下の通り設定
- イメージについては、プルダウン下部の最新のものを選択
- イメージのバージョンについても、最新を選択
- 他の項目は変更しない
アーティファクトの設定
- ビルドプロジェクトを作成を選択
- しばらくするとビルドプロジェクトが作成される
- 自動でIAMロールが作成される
IAMロールの設定
- ビルドプロジェクト作成時にIAMロールが自動作成されている
- このIAMロールにCodeDeployにアクセスできるようポリシーをアタッチする
追加でポリシーをアタッチする
- 作成したビルドプロジェクト>ビルドの詳細タブ>環境>サービスロール
- ここに記載されているIAMロールのリンクを選択
- 許可を追加を選択
- 以下のポリシーを選択して追加する
- AWSCodeDeployDeployerAccess
ビルドプロジェクトに合わせてCloud9を操作
buildspec.ymlを作成する
- 以下の画像を参考に変更を加える
- まず、index.htmlについて、srcフォルダを作成して、その配下に移動する
- srcフォルダと同階層に、buildspec.ymlファイルを作成して以下のように記述する
- commandsのxxxについては、以下のようにする
- –application-name:後ほど入力
- –s3-location:アーティファクト用に作成したS3名称を入力
- sample-artifact-bucket-001
version: 0.2
phases:
build:
commands:
- aws deploy push --application-name xxx --s3-location s3://xxx/artifact.zip --source src
artifacts:
files:
- '**/*'
base-directory: src
CodeDeployの設定
CodeDeploy向けにIAMロールを作成
- 任意のロール名を入力
- 以下のポリシーを選択
アプリケーションの作成
- アプリケーションの作成を選択
以下のように入力して作成
ビルドの実行
- Cloud9でcommands項目に、作成したアプリケーション名を入力
- デプロイグループの作成
- 任意のデプロイグループ名を入力
- サービスロール>作成したIAMロールを指定
- 環境設定>AmazonEC2インスタンスを選択
- タググループにデプロイ用に作成したEC2インスタンスのNameタグを指定する
- Load Balancer >ロードバランシングを有効にするのチェックを外す
- デプロイグループの作成を選択
- appspec.ymlの作成
- srcフォルダ配下にappspec.ymlを作成する
- 以下のように記述して保存する
version: 0.0
os: linux
files:
- source: index.html
destination: /var/www/html/
コードの変更をCodeCommitにpushする
git add -A
git commit -m "fix"
git push origin master
- ビルドプロジェクトから選択>ビルドを開始>今すぐ始めるを選択
- ビルドが失敗する場合は、以下を確認
- ファイル、フォルダの階層が正しいか
- コードにタイプミスが無いか
- “buildspec.yml”>”commands”は適切に書き換えたか
アプリケーションをデプロイする
- アプリケーションをデプロイするを選択
- 作成したデプロイグループを選択
- リビジョンの場所>アーティファクトを保存したS3バケットを選択
- デプロイの作成を選択
デプロイが失敗する!
- 以下の場合、デプロイエージェントが起動していても、デプロイが失敗するケースがあります。
- デプロイEC2インスタンスの停止/再開をしている
- EC2インスタンス起動後にIAMロールをアタッチしている
- その際は、EC2インスタンスに接続して、以下のコマンドでCodeDeployAgentの再起動を行い、再度デプロイを実行します。
- statusコマンドで、PIDが変わっていることは確認しておきます
- ビルドプロジェクト画面に戻り、デプロイの再思考を選択する
sudo service codedeploy-agent status
sudo service codedeploy-agent restart
sudo service codedeploy-agent status
デプロイが成功したことを確認
- デプロイEC2インスタンスのパブリックIPをアドレスバーに貼り付けてアクセスする
- index.htmlの内容が表示されることがわかる
CodePipelineの設定
- 以下の通り設定して作成する
- 作成した時点で、パイプラインが実行される
- コードに変更を加えていないため、変化なし
パイプラインの動作検証
- コードに変更を加えて保存
変更をコミットしてプッシュする
git add -A
git commit -m "add string"
git push origin master
パイプラインが進行中になる
デプロイまで実行されて、index.htmlの内容が更新されたことを確認
事後処理
忘れずに今回作成したリソースを削除しておきましょう
- S3バケット
- IAMロール
- EC2インスタンス
- CodeCommit
- CodeBuild
- CodeDeploy
- CodePipeline
コメント