S3にzipで固めたソースファイルから1台のEC2にデプロイするって構成です。
もくじ
① S3バケットの作成
- バケット名:bf-deploy-bucket
- バージョニングを有効化する
② IAMロールの作成
CodeDeploy-Manage-EC2-Role
CodeDeployからEC2やAutoScalingを参照・操作する為のロール
- 「IAM → ロール → ロールの作成 → CodeDeploy → ユースケースの選択(CodeDeploy) → 次(アクセス権限) → 次(確認) → ロールの作成」
EC2-Manage-S3-Role
S3から情報取得するロールの作成
- 「IAM → ロール → ロールの作成 → EC2 → 次(アクセス権限) → AmazonS3ReadOnlyAccessを選択 → 次(確認) → ロールの作成」
EC2にロールをアタッチ
- 「ec2管理 → インスタンス選択 → アクション → インスタンスの設定 → IAMロールの割当て/置換」からアタッチ
タグを設定しておく
- キー:Deploy
- 値:bf
③ EC2でCodeDeploy-Agentをインストール
$ sudo yum -y install ruby wget $ cd /home/ec2-user $ wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install $ chmod +x ./install $ sudo ./install auto
$ sudo systemctl enable codedeploy-agent $ sudo systemctl start codedeploy-agent
$ sudo yum -y install httpd $ sudo systemctl enable httpd $ sudo systemctl start httpd
$ sudo mkdir -p /var/www/html/app $ exit
④ アップロードするソースファイルを設計する
master.zip ├── appspec.yml ├── master.jar ├── test ┗── test.txt
こういう形とした。
appspec.yml
version: 0.0 os: linux files: - source: / destination: /var/www/html/app permissions: - object: /var/www/html/app owner: apache group: apache mode: 755 type: - directory - object: /var/www/html/app owner: apache group: apache mode: 755 type: - file
⑤ CodeDeploy デプロイグループの作成
●アプリケーション作成
- CodeDeploy の Console画面にて、デプロイ → アプリケーション →
- →デプロイのプラットフォームをEC2設定
- →アプリケーションの作成
●デプロイグループ作成
- デプロイグループ名:bf-DeployA
- サービスロール:arn:aws:iam::925948485307:role/CodeDeploy-Manage-EC2-Role
- デプロイタイプ:インプレース
●環境設定
Amazon EC2 インスタンス
タグ設定
キー:Deploy
値:bf
- デプロイ設定:CodeDeployDefault.OneAtATime
- ロードバランサー:ロードバランシングを有効にするのチェックをはずす
⑥パイプラインの作成
- パイプライン名:bf-TEST-PipeLine
- サービスロール:新規で作成
- ソースプロバイダー:Amazon S3
- バケット:bf-deploy-bucket
- S3オブジェクトキー:master.zip
- 検出オプションを変更する:Amazou CloudWatch Events(推奨)
- ビルドステージを追加する:ビルドステージをスキップ
- デプロイプロバイダー: AWS CodeDeploy
- アプリケーション名:bf-TEST-App
- デプロイグループ:bf-DeployA
⑦S3にアップロードしてデプロイ
master.zip ├── appspec.yml ├── master.jar ├── test ┗── test.txt
この構成でmaster.zipをbf-deploy-bucketバケットにアップロードすると、CloudWatch Eventが発火して、CodePipelineが走って、CodeDeploy、そしてEC2の/var/www/html/appにデプロイされる。
エラー対応
EC2のログから確認することができる
$ tail -F /var/log/aws/codedeploy-agent/codedeploy-agent.log 2019-10-07 13:00:26 INFO [codedeploy-agent(3663)]: Version file found in /opt/codedeploy-agent/.version with agent version OFFICIAL_1.0-1.1597_rpm. 2019-10-07 13:00:26 ERROR [codedeploy-agent(3663)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile
IAMロールの読み込みの問題
CodeDeployエージェントがEC2のIAMロールを読み込んでいない
$ sudo systemctl restart codedeploy-agent
CodeDeployエージェントをインストールしてから、IAMロールを取り付けた場合は権限をエージェントが読みこめていない。
読み込ませる。
ソースの構成がおかしい
この構成なら、
master.zip ├── appspec.yml ├── master.jar ├── test ┗── test.txt
appspec.yml
version: 0.0 os: linux files: - source: / destination: /var/www/html/app permissions: - object: /var/www/html/app owner: apache group: apache mode: 755 type: - directory - object: /var/www/html/app owner: apache group: apache mode: 755 type: - file
こうなる。
本番とCodeDeployのリビジョンとの不整合
不整合が起こってますよ〜!っていう具体的な通知などはない。
本番のソースやログファイルなどが変化してしまって、CodeDeployのリビジョンとの整合性エラーでデプロイに失敗するようになる。
対応
- CodeDeployのリビジョン管理からログや画像などのディレクトリを除外しておく
設定として気をつける。 - CodeDeploy, CodePipelineを削除して作り直して再デプロイ
これが早い。
不整合が起こるとappspec.ymlなどが正しくてもひたすらエラーになるので詰まったら、5分もかからないのでCodeDeploy, CodePipelineを再作成してみるのがおすすめです。
appspec.yml hook対応版
master.zip ┝─master.jar ┝─appspec.yml ┗─scripts ┗─stopApache.sh ┗─startApache.sh
appspec.yml
version: 0.0 os: linux files: - source: / destination: /home/ubuntu/app hooks: BeforeInstall: - location: scripts/stopApache.sh timeout: 300 runas: root AfterInstall: - location: scripts/startApache.sh timeout: 300 runas: root
scripts/stopApache.sh
#!/bin/bash set -e # スクリプトディレクトリの取得 SCRIPT_DIR=`dirname $0` cd $SCRIPT_DIR systemctl stop apache2
scripts/startApache.sh
#!/bin/bash set -e # スクリプトディレクトリの取得 SCRIPT_DIR=`dirname $0` cd $SCRIPT_DIR systemctl start apache2
ELBを利用した場合のデプロイが遅い!
ELBの設定を確認する
デプロイ待機時間 ≒ Interval × Healthy Threshold
- Interval: 20sec, Healthy Threshold:10sec
→200秒ぐらい - Interval: 5sec, Healthy Threshold:5sec
→25秒ぐらい
@see
- AWS CodeDeployの使い方
- CodeDeployでデプロイに失敗した場合の挙動を確認する
- AWS CodeDeploy の AppSpec を読み解く
- https://github.com/aws-samples/aws-codedeploy-samples/tree/master/load-balancing/elb
// 今はこれをしなくてもCodeDeployがアップデートしてBlue/Greenでダウンタイムなしでデプロイできる。
hook