AWS CodeDeploy の使い方
ワンコマンド・デプロイ
株式会社ソニックムーブ
メディア事業部
茅根 幸夫
(ちのね ゆきお)
2017年05月23日
About Me
・茅根 幸夫(ちのね ゆきお)
・Sonicmoov Co.,Ltd.
・基幹エンジニア歴5年、Webエンジニア歴10年
・茨城県ひたちなか市出身
(右図の茅根町とは全く関係ございません。名前が同じだったので掲載しただけです)
常陸太田航空衛星センター
オセロの生みの親
長谷川 五郎氏の出身地
誰もが知ってる
水戸黄門
社会現象にもなった
ガルパン
非公認キャラ
ねば〜る君
About Sonicmoov
・BtoB BtoC
・リッチ広告配信ソリューション
https://www.sonicmoov.com/service/guile/
・LINEビジネスコネクト活用プラットフォーム「TONARIWA(トナリワ)」
https://www.sonicmoov.com/works/tonariwa/
・ワンストップ・ソリューション(企画・デザイン・開発・運用までを社内で)
・Sonicmoov LAB
https://lab.sonicmoov.com/
アジェンダ
・AWS CodeDeploy とは?
・AWS CodeDeploy の設定
・デプロイ前に自動テストができる CircleCI とは?
・CircleCI と CodeDeployの連携
・CircleCI と Bitbucketの連携
・ワンコマンドによる デプロイ・フロー
・使ってみて分かった、 AWS CodeDeploy の問題点と対策
AWS CodeDeploy とは?
AWS CodeDeploy とは?
・複数サーバをグループ化し、グループ単位で一気にデプロイ可能
・デプロイするファイルは、S3やgithubから取得可能(今回はS3から取得)
・AutoScaleグループを指定してデプロイ可能
・デプロイ失敗や、AWS CloudWatchのアラート検知でロールバック可能
・AWS SNSにイベントを通知できる(デプロイ成功通知など)
・連携できるAWS以外の外部サービスが沢山ある
AWS CodeDeploy の設定
・IAMコンソールからデプロイ用ロールを2つ使用
・AWS CodeDeploy Agent のインストールと設定
・デプロイグループの作成と編集
・AWS CodeDeployと連携出来る外部サービス紹介
IAMコンソール
からデプロイ用
のロールを作成
この「ロールARN」で制御
AWS CodeDeploy 用のロール作成(1つ目)
IAMコンソール
からデプロイ用
のロールの信頼
関係を編集
サポートされている
全てのリージョンに
アクセスを許可する
場合の設定。
AWS CodeDeploy 用のロール作成(1つ目)
IAMコンソール
からデプロイ先
EC2用にS3アク
セス可能なロー
ルをアタッチ
今回はS3からソース
をデプロイするので
S3アクセスを許可する。
S3アクセス用のロールをEC2にアタッチ(2つ目)
AWS CodeDeploy Agent とは?
・デプロイ先サーバ上で起動しているRuby製のデーモンプログラム
・AWSマネジメントコンソールや、AWS APIからのリクエストを検知する
・リクエストを検知すると appspec.yml に書かれた内容でデプロイ実行
(各サーバの /var/log/aws/codedeploy-agent/codedeploy-agent.log にログがある)
・スケールアウトが発生した場合、最後にデプロイに成功
したリビジョンを、起動時にS3からデプロイする。
OutOfService
新規起動
EC2
(E)
InService
EC2
(B)
AutoSucaling グループ
InService
EC2
(A)
S3
デプロイ
ELB
AWS CodeDeploy Agent のインストール
・デプロイ先のEC2に、CodeDeployエージェントをインストール
[公式] http://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install.html
$sudo yum update
$sudo yum install ruby
$sudo yum install wget
$cd /home/ec2-user
$wget https://bucket-name(※).s3.amazonaws.com/latest/install
$chmod +x ./install
$sudo ./install auto
※bucket-name には リージョンを指定。
東京リージョンならば「aws-codedeploy-ap-northeast-1」
$sudo service codedeploy-agent status
The AWS CodeDeploy agent is running as PID xxxx ← running中ならOK
・インストール確認
AWS CodeDeploy Agent の設定
version: 0.0
os: linux
files:
- source: / ← デプロイファイル(「/」は全て)
destination: /var/www/release/xxxxxx ← デプロイ先を指定
hooks:
BeforeInstall:
- location: scripts/BeforeInstall.sh ← デプロイ前に実行するシェルを指定(任意)
runas: sonicmoov
AfterInstall:
- location: scripts/AfterInstall.sh ← デプロイ後に実行するシェルを指定(任意)
runas: sonicmoov
・リビジョンルートに「appspec.yml」を作成し、デプロイ内容を記載する
[公式] http://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html
AWS CodeDeploy デプロイグループの作成&説明
デプロイグループ名
前述で作成したAWS CodeDeploy
用の「ロールARN」を設定
デプロイグループの
作成と編集
AWS CodeDeploy デプロイグループの作成&説明
このAutoScaling
グループに対して
デプロイを実施
AWS CodeDeploy デプロイグループの作成&説明
デプロイのロール
バック有効化
AWS CodeDeploy デプロイグループの作成&説明
AWS CloudWatch
のアラーム設定
AWS CodeDeploy デプロイグループの作成&説明
AWS SNSの
通知設定
AWS CodeDeploy と連携できるサービス
・AWS CodeDeployと連携できる外部パートナーサービス
[公式] http://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/integrations-partners.html
・Ansible
・Atlassian – Bamboo and Bitbucket
・Chef
・CircleCI
・CloudBees
・Codeship
・GitHub
・Jenkins
・Puppet Labs
・SaltStack
・Solano Labs
・TeamCity
・Travis CI
上記は 2017/5/21現在のAWS公式ドキュメントより引用
今回連携します。
デプロイ時の
自動テストで
利用します
CircleCI とは?
デプロイ前に自動テストができる
・CIサービスの1つで、クラウド型のサービス
- CI(継続的インテグレーション)とはプログラムの品質改善 や納期短縮 の為の習慣や手法の事。
- CIサービスとは、CIを自動化したサービスの事。
- 具体的にはエンジニアが今まで実施したテストを一気に行い、バグ等を自動で見つける。
- バグが見つかったらデプロイを中止 するので、未然にデグレを防ぐことができる。
・コンテナ上にサーバー環境を構築することができ、
テスト環境として利用可能
・1コンテナならば無料で利用可能。
コンテナ内にソフトを自由にインストール可能。
ハードウェア
OS
コンテナ管理ソフト
コンテナ
MySQL
PHP
ライブラリ
コンテナ
MySQL
PHP
ライブラリ
.....
CircleCI とは?
CircleCI と CodeDeployの連携
CircleCI と CodeDeployの連携
(概要)
:
deployment: ← CodeDeployとの連携
production:
branch: master ← CircleCIがmasterブランチへのpushを検知したら処理
codedeploy:
prod-app:
deployment_group: prod-deploy-group ← CodeDeployで定義したデプロイグループ
application_root: /
region: ap-northeast-1
revision_location:
revision_type: S3
s3_location:
bucket: codedeploy.sonicmoov-media.com
key_pattern: master/prod-app-{SHORT_COMMIT}
・リビジョンルートに「circle.yml」を作成、circle.ymlのcodedeployブロック
を使用して、CodeDeployの詳細設定を記述します。
[公式] https://circleci.com/docs/1.0/continuous-deployment-with-aws-codedeploy
CircleCI と Bitbucketの連携
・CircleCI は Bitbucketのリポジトリと連携できる。
・連携することにより Bitbucketへのpushを検知し CircleCIを動かす事が可能
<弊社のBitbucket運用ルール>
- masterブランチ(本番環境用のブランチ)
- developブランチ(開発環境用のブランチ)
- feature/[任意名称]ブランチ(個別開発用ブランチ(※))
・ブランチやその他の詳細設定は「circle.yml」に記述する。
(概要)
CircleCI と Bitbucketの連携
CircleCI と Bitbucketの連携
CircleCIのサイトにログイン
し、Bitbucketのリポジトリ
と連携する。
このリポジトリへのpushを
検知することができる。
(サイトでの設定)
CircleCI と Bitbucketの連携
(circle.ymlの設定)
general:
branches:
only:
- master ← CircleCIが検知するブランチを指定
- develop
- /feature.*/
machine: ← CircleCiのコンテナの設定(1コンテナなら無料で使える)
timezone: Asia/Tokyo
php:
version: 7.0.11 ← デフォルトではphp7.0.4が入っているので本番サーバと同じに変更
services: ← CircleCiがデフォルトでインストールしていないものをインストール
- elasticsearch - redis
:
・リビジョンルートに「circle.yml」に詳細内容を記載する
[公式] https://circleci.com/docs/1.0/configuration/
ワンコマンドによる デプロイ・フロー
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack
API
EC2
DBチェック
API
AWS
S3
slack
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
master:develop
” master : develop ” と入力すると以下の
処理を自動で行う。
・developブランチのDBのスキーマチェック
・チェック通過後にmasterブランチにマージ
・新マスターブランチで動作テスト
・新マスターブランチ動作テスト通過後に
本番環境にデプロイ
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
1
slack
slack API
Incoming
WebHooks
(slackに表示)
slack API(Outgoing WebHooks)
にアクセス
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
2
slack
slack API
Incoming
WebHooks
(slackに表示)
slack API(Outgoing WebHooks)が開発環境
のDBチェックAPI にアクセス。
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
3
DBチェックAPI が実行される。
開発環境のDB構造の方が最新なので、本番
環境のDB構造が古くないかどうかチェックする。
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
エラー!
xxxxxxxxxxxxxx
xxx [詳細] xxx
xxxxxxxxxxxxxx
xxxxxxxxxxxxxx
4
もしも、本番環境のDB構造(スキーマやIndex)が不一
致だったら、デプロイ処理中断。
slackにエラーを表示する。
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
4
本番環境のDB構造(スキーマやIndex)が最新
ならば、developブランチをmasterブランチに
マージし、Bitbucketへpushする。
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
5
マージ完了
slackにマージが成功したことを表示
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
マージ完了
6
CitcleCIとBitbucketの連携機能により、Bitbucketに
pushされたことをCircleCIが自動検知し、以下を実
行。
・CircleCIのコンテナにサーバ環境構築
・phpunitによるUnitTestを全て実行
※このステップが一番時間がかかります。
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
マージ完了
エラー!
xxxxxxxxxxxxxx
xxx [詳細] xxx
7
もしも、UnitTestで1つ以上エラーが出たら、デプロ
イ処理中断。
slackにエラーを表示する。
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
マージ完了
7
UnitTestを全て通過後、masterブランチのソー
スを最新のリビジョンとしてS3にアップロード
する。
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
マージ完了
8
CodeDeployとCitcleCIの連携機能によ
り、デプロイ処理要求。
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
slack API
Incoming
WebHooks
(slackに表示)
マージ完了
9
S3にある最新リビジョンのソースを
AutoScalingグループ内の全てのEC2に
デプロイする。
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
マージ完了
master:develop
slack
マージ完了
デプロイ完了
slack API
Incoming
WebHooks
(slackに表示)
10
以下の流れでslackにデプロイ完了を表
示する。
・CodeDeployがSNSに通知
・LambdaがSNS通知を検知して
slackにデプロイ完了を表示。
AWS
S3
本番用のEC2 ×n
(masterブランチ)
AWS
CodeDeploy
AWS
SNS
AWS
Lambda
slack API
Outgoing WebHooks
(外部要求)
Incoming WebHooks
(slackに表示)
master:develop
RDS
DB
チェック
API
EC2
RDS
開発のEC2 ×1
(developブランチ)
slack
マージ完了
master:develop
slack
マージ完了
デプロイ完了
slack API
Incoming
WebHooks
(slackに表示)
10
「master:develop」と入力
しただけでデプロイ完了!
AWS CodeDeployの問題点と対策
使ってみて分かった
AWS CodeDeploy
InService
(稼働中)
Terminate
(削除中)
EC2
(D)
EC2
(E)
InService
(稼働中)
EC2
(C)
InService
(稼働中)
EC2
(B)
AutoSucaling
グループ
InService
(稼働中)
EC2
(A)
AWS
S3
<問題点>
左図のように、CodeDeployからTerminate中(削除中)の
EC2に対してもデプロイを実施してしまい、デプロイ処
理が完了しない不具合が発生。
スケールイン等により削除中の場合、EC2(D)へ
のデプロイがいつまでも完了しないため、次の
EC2(E)のデプロイが出来ない。
<対策>
AWS Supportに問い合わせた結果、本件対策用スクリ
プトを提供いただきました。
■対策用スクリプト概要
デプロイ前にインスタンスの状態をチェックして、AutoScaling 動作を
一時的に停止 (suspend)した状態でデプロイを実行し、デプロイが完
了すれば元に戻す、という一連の操作をまとめたもの。
対策用スクリプトについて
・後日、公開いたします(公開日未定)
・ご希望の方には、メールにてご提供いたします。
・本スクリプトはAWSで公式にサポートしているものではございません。
その為、管理やメンテナンスについては弊社にて対応させていただきます。
・もし何かスクリプトに関するフィードバックがございましたら、AWSで
はなく弊社までお知らせください。
ご清聴ありがとうございました。

【AWS×Deployment】TechTalk #5