Slide 1

Slide 1 text

GitHub Flow で作る AWS インフラストラクチャ AWS Dev Day Tokyo 2018 Lightning Talk 大会 October 31, 2018 Isao Shimizu

Slide 2

Slide 2 text

About me 清水 勲 @isaoshimizu 株式会社ミクシィ ヴァンテージスタジオ みてね事業部 開発グループ 2011 年8 月 中途入社、SNS mixi アプリ運用チーム 2014 年4 月 モンスターストライク サーバーエンジニア、SRE 2018 年2 月 家族アルバム「みてね」 SRE AWS Summit Tokyo, TechLION, hbstudy, Internet Week, Think Japan IBM Code Day などの登壇 Qiita, Medium, Software Design 記事執筆 記事: 大規模インフラのSRE から社内スタートアップへの挑戦。ベテランエンジニアのキャリアの作り方 2

Slide 3

Slide 3 text

300 万人が使う No.1 家族アルバムアプリ「みてね」 https://mitene.us/ 特徴 子供の写真や動画を共有、整理 家族だけで安心して使えるアルバムアプリ フォトブック、DVD の販売 2015 年4 月 サービス開始 2017 年7 月 英語版提供開始 2018 年7 月 ユーザー数 300 万人突破 3

Slide 4

Slide 4 text

AWS のインフラ管理、どうやっていますか 4

Slide 5

Slide 5 text

AWS でのインフラ管理といえば AWS マネジメントコンソール ウェブベースの管理ツール AWS Console モバイルアプリもある AWS CloudFormation JSON/YAML ファイルの記述でAWS リソースの環境構築 HashiCorp Terraform .tf ファイルの記述で様々なクラウドリソースの環境構築 5

Slide 6

Slide 6 text

マネジメントコンソールだけ使っていると起きること どんな手順で構成したかは操作した人しかわからない Wiki やドキュメントツールなどを使って手順書を書く スクリーンショットなどが無いと伝わりづらい内容もある 手順の確認、レビューがしづらい Slack にスクリーンショットを貼って「これ実行します!」 同じ手順の繰り返し 多くの手間 6

Slide 7

Slide 7 text

プログラマならコードで管理したい 7

Slide 8

Slide 8 text

Terraform を使う 8

Slide 9

Slide 9 text

Terraform を使う理由 AWS 以外の管理もできる たとえば、Google Cloud 、New Relic 、GitHub の管理 90 以上のサービスに対応 https://www.terraform.io/docs/providers/ https://github.com/hashicorp/terraform スター数 14,000 超え 毎日のようにコミットがされ開発が活発 "AWS だけ" ならCloudFormation を使うのはアリ AWS SAM(Serverless Application Model) を使うならなおさら 9

Slide 10

Slide 10 text

Terraform の課題 10

Slide 11

Slide 11 text

Terraform をどこで実行するか terraform コマンドをどこの環境で実行するのか 複数の開発者が実行するのは怖い 実行の競合による先祖返り 手元のPC で実行する場合、強力なアクセスキーが必要 EC2 上で実行する場合、SSH の権限が悩ましい 最近だとAWS Cloud9 、AWS Systems Manager (セッションマネ ージャー)とかありかも? しかし手作業は面倒 11

Slide 12

Slide 12 text

workspace を使うか、ディレクトリを分けるか みてねでは1 レポジトリでディレクトリを分ける運用 workspace は後述するCI/CD 環境に不向き 複数のworkspace を切り替えて自動化させるのは複雑になりそう 更新があったtf ファイルが存在するディレクトリをスクリプトで検知 して、対象のディレクトリのみでTerraform を実行するように工夫 git コマンドを駆使して実行対象のディレクトリを抽出して個別に 実行 12

Slide 13

Slide 13 text

自動化しよう 13

Slide 14

Slide 14 text

CI/CD 環境をTerraform の実行環境とする GitHub と連携させて自動化する(GitHub Flow ) tf ファイルを書く Pull Request を作る/commit をpush で terraform plan 実行 レビュー、Approve Pull Request マージで terraform apply 実行 GitHub レポジトリの設定 ✓ Require pull request reviews before merging ✓ Require status checks to pass before merging ✓ Require branches to be up to date before merging 14

Slide 15

Slide 15 text

CircleCI を使う .circleci/con g.yml を書く GitHub のWebhook で連携 ググるとサンプルも多くて比較的簡単に設定できる Work ow や対象のBranch 指定が柔軟にできる クレデンシャル情報の登録 AWS の認証情報を設定する画面が用意されている 設定後はキーの表示がマスクされるがCircleCI の権限(GitHub の 権限)の管理をちゃんとしておかないと不安 コンテナ数に応じた月額課金(1 個無料。2 個~は$50/ コンテナ) 15

Slide 16

Slide 16 text

AWS CodeBuild を使う buildspec.yml を書く( version: 0.2 で書こう) GitHub のWebhook で連携 ビルドプロジェクトにIAM ロールが使えるのが良い 実行環境で使える環境変数があるが、ドキュメントにすべてが書か れていないので env コマンドなどで確認すると良い 例: CODEBUILD_AGENT_ENV_CODEBUILD_BUILD_URL (ビルド プロジェクトのURL ) 分課金(Linux でのビルド、1 分あたり$0.005 から)。無料枠も。 3 つのインスタンスタイプ(small 、medium 、large ) 16

Slide 17

Slide 17 text

GitHub にTerraform 実行結果の通知 tfnotify https://github.com/mercari/tfnotify/ GitHub のPull Request のコメントにterraform plan やterraform apply の結果を書いてくれるメルカリのOSS (超便利! ) CI/CD 環境で実行 いちいちログ画面を見に行かなくても良い 17

Slide 18

Slide 18 text

tfnotify が対応する環境はCircleCI or TravisCI のみでしたが... 18

Slide 19

Slide 19 text

昨日、AWS CodeBuild にも対応しました! 1 週間前にCodeBuild 対応のPull Request を出したところ、昨日マージ されました!(レビューありがとうございます!) https://github.com/mercari/tfnotify/pull/23 19

Slide 20

Slide 20 text

【補足】Terraform をAWS CodeBuild で使う際のポイント git clone の深さをFull にして過去のcommit を参照する ブランチフィルタにmaster を設定して、master に向けたPull Request のみ実行する Pull Request が作られてマージされるまでは CODEBUILD_SOURCE_VERSION にpr/ 番号という形式の値が入ってくる。これを見てterraform plan を 実行する Pull Request のマージでCODEBUILD_SOURCE_VERSION はマージコミットの ハッシュ値が入ってくる。これを見てterraform apply を実行する tfnotify にPR の番号を渡せるように、マージ時にgit log コマンドで Merge pull request #100 from ブランチ名といったコミット文言からPR 番 号を抜き出して、CODEBUILD_SOURCE_VERSION にセットする 20

Slide 21

Slide 21 text

まとめ インフラの管理はできる限りコード化&自動化 Terraform の実行環境はCI/CD 環境がおすすめ GitHub Flow で運用する tfnotify を使ってplan/apply の結果をGitHub へ通知 tfnotify はAWS CodeBuild にも対応しました AWS CodeBuild はIAM が使えて、実行時間課金なのがメリット 21

Slide 22

Slide 22 text

Join our team!! https://mitene.us/recruit 22