Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

【AWS×Deployment】TechTalk #5

607 views

Published on

AWS CodeDeploy + CircleCI + Bitbucket を使った「ワンコマンド・デプロイ」のお話。
SONICMOOV LAB ( ソニックムーブ ラボ )」もぜひご覧ください!
https://lab.sonicmoov.com/

Published in: Engineering
  • Be the first to comment

【AWS×Deployment】TechTalk #5

  1. 1. AWS CodeDeploy の使い方 ワンコマンド・デプロイ 株式会社ソニックムーブ メディア事業部 茅根 幸夫 (ちのね ゆきお) 2017年05月23日
  2. 2. About Me ・茅根 幸夫(ちのね ゆきお) ・Sonicmoov Co.,Ltd. ・基幹エンジニア歴5年、Webエンジニア歴10年 ・茨城県ひたちなか市出身 (右図の茅根町とは全く関係ございません。名前が同じだったので掲載しただけです) 常陸太田航空衛星センター オセロの生みの親 長谷川 五郎氏の出身地 誰もが知ってる 水戸黄門 社会現象にもなった ガルパン 非公認キャラ ねば〜る君
  3. 3. About Sonicmoov ・BtoB BtoC ・リッチ広告配信ソリューション https://www.sonicmoov.com/service/guile/ ・LINEビジネスコネクト活用プラットフォーム「TONARIWA(トナリワ)」 https://www.sonicmoov.com/works/tonariwa/ ・ワンストップ・ソリューション(企画・デザイン・開発・運用までを社内で) ・Sonicmoov LAB https://lab.sonicmoov.com/
  4. 4. アジェンダ ・AWS CodeDeploy とは? ・AWS CodeDeploy の設定 ・デプロイ前に自動テストができる CircleCI とは? ・CircleCI と CodeDeployの連携 ・CircleCI と Bitbucketの連携 ・ワンコマンドによる デプロイ・フロー ・使ってみて分かった、 AWS CodeDeploy の問題点と対策
  5. 5. AWS CodeDeploy とは?
  6. 6. AWS CodeDeploy とは? ・複数サーバをグループ化し、グループ単位で一気にデプロイ可能 ・デプロイするファイルは、S3やgithubから取得可能(今回はS3から取得) ・AutoScaleグループを指定してデプロイ可能 ・デプロイ失敗や、AWS CloudWatchのアラート検知でロールバック可能 ・AWS SNSにイベントを通知できる(デプロイ成功通知など) ・連携できるAWS以外の外部サービスが沢山ある
  7. 7. AWS CodeDeploy の設定 ・IAMコンソールからデプロイ用ロールを2つ使用 ・AWS CodeDeploy Agent のインストールと設定 ・デプロイグループの作成と編集 ・AWS CodeDeployと連携出来る外部サービス紹介
  8. 8. IAMコンソール からデプロイ用 のロールを作成 この「ロールARN」で制御 AWS CodeDeploy 用のロール作成(1つ目)
  9. 9. IAMコンソール からデプロイ用 のロールの信頼 関係を編集 サポートされている 全てのリージョンに アクセスを許可する 場合の設定。 AWS CodeDeploy 用のロール作成(1つ目)
  10. 10. IAMコンソール からデプロイ先 EC2用にS3アク セス可能なロー ルをアタッチ 今回はS3からソース をデプロイするので S3アクセスを許可する。 S3アクセス用のロールをEC2にアタッチ(2つ目)
  11. 11. 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
  12. 12. 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 ・インストール確認
  13. 13. 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
  14. 14. AWS CodeDeploy デプロイグループの作成&説明 デプロイグループ名 前述で作成したAWS CodeDeploy 用の「ロールARN」を設定 デプロイグループの 作成と編集
  15. 15. AWS CodeDeploy デプロイグループの作成&説明 このAutoScaling グループに対して デプロイを実施
  16. 16. AWS CodeDeploy デプロイグループの作成&説明 デプロイのロール バック有効化
  17. 17. AWS CodeDeploy デプロイグループの作成&説明 AWS CloudWatch のアラーム設定
  18. 18. AWS CodeDeploy デプロイグループの作成&説明 AWS SNSの 通知設定
  19. 19. 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公式ドキュメントより引用 今回連携します。 デプロイ時の 自動テストで 利用します
  20. 20. CircleCI とは? デプロイ前に自動テストができる
  21. 21. ・CIサービスの1つで、クラウド型のサービス - CI(継続的インテグレーション)とはプログラムの品質改善 や納期短縮 の為の習慣や手法の事。 - CIサービスとは、CIを自動化したサービスの事。 - 具体的にはエンジニアが今まで実施したテストを一気に行い、バグ等を自動で見つける。 - バグが見つかったらデプロイを中止 するので、未然にデグレを防ぐことができる。 ・コンテナ上にサーバー環境を構築することができ、 テスト環境として利用可能 ・1コンテナならば無料で利用可能。 コンテナ内にソフトを自由にインストール可能。 ハードウェア OS コンテナ管理ソフト コンテナ MySQL PHP ライブラリ コンテナ MySQL PHP ライブラリ ..... CircleCI とは?
  22. 22. CircleCI と CodeDeployの連携
  23. 23. 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
  24. 24. CircleCI と Bitbucketの連携
  25. 25. ・CircleCI は Bitbucketのリポジトリと連携できる。 ・連携することにより Bitbucketへのpushを検知し CircleCIを動かす事が可能 <弊社のBitbucket運用ルール> - masterブランチ(本番環境用のブランチ) - developブランチ(開発環境用のブランチ) - feature/[任意名称]ブランチ(個別開発用ブランチ(※)) ・ブランチやその他の詳細設定は「circle.yml」に記述する。 (概要) CircleCI と Bitbucketの連携
  26. 26. CircleCI と Bitbucketの連携 CircleCIのサイトにログイン し、Bitbucketのリポジトリ と連携する。 このリポジトリへのpushを 検知することができる。 (サイトでの設定)
  27. 27. 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/
  28. 28. ワンコマンドによる デプロイ・フロー AWS CodeDeploy AWS SNS AWS Lambda slack API EC2 DBチェック API AWS S3 slack
  29. 29. 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に表示)
  30. 30. 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ブランチにマージ ・新マスターブランチで動作テスト ・新マスターブランチ動作テスト通過後に 本番環境にデプロイ
  31. 31. 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) にアクセス
  32. 32. 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 にアクセス。
  33. 33. 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構造が古くないかどうかチェックする。
  34. 34. 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にエラーを表示する。
  35. 35. 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する。
  36. 36. 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にマージが成功したことを表示
  37. 37. 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を全て実行 ※このステップが一番時間がかかります。
  38. 38. 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にエラーを表示する。
  39. 39. 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にアップロード する。
  40. 40. 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の連携機能によ り、デプロイ処理要求。
  41. 41. 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に デプロイする。
  42. 42. 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にデプロイ完了を表示。
  43. 43. 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」と入力 しただけでデプロイ完了!
  44. 44. AWS CodeDeployの問題点と対策 使ってみて分かった
  45. 45. 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)した状態でデプロイを実行し、デプロイが完 了すれば元に戻す、という一連の操作をまとめたもの。
  46. 46. 対策用スクリプトについて ・後日、公開いたします(公開日未定) ・ご希望の方には、メールにてご提供いたします。 ・本スクリプトはAWSで公式にサポートしているものではございません。 その為、管理やメンテナンスについては弊社にて対応させていただきます。 ・もし何かスクリプトに関するフィードバックがございましたら、AWSで はなく弊社までお知らせください。
  47. 47. ご清聴ありがとうございました。

×