AWS サーバーレスアーキテクチャでつくる Slack ChatOps / Use Slack ChatOps to Deploy Your Code

AWS サーバーレスアーキテクチャでつくる Slack ChatOps / Use Slack ChatOps to Deploy Your Code

サポーターズさんの勉強会で登壇した資料です。
サーバーレスと Slack App について話しました。

AWS サーバーレスアーキテクチャでつくるSlack ChatOps
https://supporterzcolab.com/event/784/

C0479b152c326746e911be790617f75b?s=128

katsuhisa_

April 08, 2019
Tweet

Transcript

  1. Copyright © 2019 Studist Corporation. All Rights Reserved AWS サーバーレスアーキテクチャでつくる

    Slack App 株式会社スタディスト 北野 勝久 サポーターズコラボ勉強会 2019/04/08
  2. Copyright © 2019 Studist Corporation. All Rights Reserved 2 #spzcolab

    イベントハッシュタグ
  3. Copyright © 2019 Studist Corporation. All Rights Reserved 3 北野

    勝久 / @katsuhisa__ Katsuhisa Kitano 株式会社スタディスト 開発部 SRE Organizer of SRE Lounge Developers Summit 登壇 etc...
  4. Copyright © 2019 Studist Corporation. All Rights Reserved 4 “伝えることを、もっと簡単に。”

    https://studist.jp/ 会社紹介
  5. Copyright © 2019 Studist Corporation. All Rights Reserved 5 サービス紹介

  6. Copyright © 2019 Studist Corporation. All Rights Reserved 6 サーバーレスでの

    Slack App のつくりかたを知る 本日のゴール
  7. Copyright © 2019 Studist Corporation. All Rights Reserved 7 DevOps(ちょっとだけ)

    Slack App テーマ サーバーレスアーキテクチャ 1 2 3
  8. Copyright © 2019 Studist Corporation. All Rights Reserved 8 話すこと

    なにをつくったか?なぜつくったか? STEP 1 どうやってつくったか?〜サーバーレスアーキテクチャ編〜 STEP 2 どうやってつくったか?〜Slack App 編〜 STEP 3 まとめ STEP 4 Agenda
  9. Copyright © 2019 Studist Corporation. All Rights Reserved 9 話さないこと

    • AWSの基本知識 • Slack の基本的な使い方や用語 • AWS Lambda のコード管理や、CI/CD • AWS SAM(サーバーレスアプリケーションモデル)や サーバーレスフレームワーク
  10. Copyright © 2019 Studist Corporation. All Rights Reserved 10 なにをつくったか?なぜつくったか?

    STEP 1 どうやってつくったか?〜サーバーレスアーキテクチャ編〜 STEP 2 どうやってつくったか?〜Slack App 編〜 STEP 3 まとめ STEP 4 Agenda
  11. Copyright © 2019 Studist Corporation. All Rights Reserved 11 今回実装したもの

    Use Slack ChatOps to Deploy Your Code – How to Integrate Your Pipeline in AWS CodePipeline with Your Slack Channel https://aws.amazon.com/blogs/devops/use-slack-chatops-to-deploy-your-code-how-to-integrate-your-pipeline-in-aws-codepipeline-with-your-slack-channel/
  12. Copyright © 2019 Studist Corporation. All Rights Reserved 12 今回実装したもの

  13. Copyright © 2019 Studist Corporation. All Rights Reserved 13 なぜ実装したか?

    背景
  14. Copyright © 2019 Studist Corporation. All Rights Reserved 14 スタディストにおける

    Production 環境の Deployment Pipeline AWS CodePipeline がトリガーされる STEP 2 AWS CodeBuild 上でアセットをプリコンパイル STEP 3 Production 同等環境にデプロイされ、最終動作確認ができる ※社内からのみアクセス可 STEP 4 が問題なければ、承認ボタンを押し、 Production にデプロイ STEP 5 GitHub で対象 Pull Request を master にマージ STEP 1
  15. Copyright © 2019 Studist Corporation. All Rights Reserved 15 課題感

    AWS CodePipeline がトリガーされる STEP 2 AWS CodeBuild 上でアセットをプリコンパイル STEP 3 Production 同等環境にデプロイされ、最終動作確認ができる ※社内からのみアクセス可 STEP 4 が問題なければ、承認ボタンを押し、 Production にデプロイ STEP 5 GitHub で対象 Pull Request を master にマージ STEP 1 master マージ権限を持つ 開発者が行う
  16. Copyright © 2019 Studist Corporation. All Rights Reserved 16 課題感

    AWS CodePipeline がトリガーされる STEP 2 AWS CodeBuild 上でアセットをプリコンパイル STEP 3 Production 同等環境にデプロイされ、最終動作確認ができる ※社内からのみアクセス可 STEP 4 が問題なければ、承認ボタンを押し、 Production にデプロイ STEP 5 GitHub で対象 Pull Request を master にマージ STEP 1 権限を持つ人が、承認ボタンを押す AWS の Production 用アカウントには READONLY 権限のみ付与を基本方針と しているため
  17. Copyright © 2019 Studist Corporation. All Rights Reserved 17 課題感

    理想状態に思いを馳せる
  18. Copyright © 2019 Studist Corporation. All Rights Reserved 18 Envoy

    開発者Matt のDevOps 定義 DevOps is the practice of developers being responsible for operating their services in production, 24/7. This includes development using shared infrastructure primitives, testing, on-call, reliability engineering, disaster recovery, defining SLOs, monitoring setup and alarming, debugging and performance analysis, incident root cause analysis, provisioning and deployment, etc. 『The human scalability of “DevOps”』 https://medium.com/@mattklein123/the-human-scalability-of-devops-e36c37d3db6a
  19. Copyright © 2019 Studist Corporation. All Rights Reserved 19 やりたかったこと

    開発者がデプロイに責任を持てるようにしたい
  20. Copyright © 2019 Studist Corporation. All Rights Reserved 20 実装方法

    Slack で承認ボタンを押せばいいのでは? → Slack ChatOps 単に、AWS の承認権限を付与するだけでも要件は満たす が、デプロイ進行状況の通知を考えると、 いずれにせよ Slack 連携したかった
  21. Copyright © 2019 Studist Corporation. All Rights Reserved 21 どうやって実現するか

    CodePipeline と Slack のやり取りどうする?
  22. Copyright © 2019 Studist Corporation. All Rights Reserved 22 今回のユースケースの特徴

    「サーバーレスアーキテクチャで実装しよう」
  23. Copyright © 2019 Studist Corporation. All Rights Reserved 23 サーバーレス?

    サーバーレスアーキテクチャ?
  24. Copyright © 2019 Studist Corporation. All Rights Reserved 24 サーバーレスアーキテクチャとは

    • サーバはある ◦ ただし、隠蔽されている ▪ 物理リソースも、その上のOSレイヤも管理不要 ◦ 「サーバではなく、コンピューティングサービスを利用する」 考え方をすることが重要 • プッシュベースのイベント駆動パイプラインを設計する ◦ ※ すべてがそうかというと、そういうわけではない ▪ 例えば、イベントソースをポーリングするケースもある
  25. Copyright © 2019 Studist Corporation. All Rights Reserved 25 サーバーレス?FaaS?

    • FaaS ◦ Function as a Service ▪ デプロイ単位が、関数 • サーバーレスが、より広域の概念と理解するとよい ◦ FaaS は、サーバーレスによって実現されるものの1つ
  26. Copyright © 2019 Studist Corporation. All Rights Reserved 26 AWS

    Lambdaって何? • AWS が提供するサーバーレスを実現するサービス ◦ 前述した 関数単位でのデプロイ を実現 • AWS Lambda 以外にも、サーバレスを実現するサービスはある ◦ e.g. Google Cloud Functions
  27. Copyright © 2019 Studist Corporation. All Rights Reserved 27 今回実現したいものの要件

    • 常駐サーバ不要 • イベント駆動で処理が実行される • もちろん、実行環境のメンテは極力減らしたい
  28. Copyright © 2019 Studist Corporation. All Rights Reserved 28 今回実現したいものの要件

    • 常駐サーバ不要 • イベント駆動で処理が実行される • もちろん、実行環境のメンテは極力減らしたい サーバーレスで実装するのにちょうど良い
  29. Copyright © 2019 Studist Corporation. All Rights Reserved 29 話すこと

    なにをつくったか?なぜつくったか? STEP 1 どうやってつくったか?〜サーバーレスアーキテクチャ編〜 STEP 2 どうやってつくったか?〜Slack App 編〜 STEP 3 まとめ STEP 4 Agenda
  30. Copyright © 2019 Studist Corporation. All Rights Reserved 30 (おさらい)今回実装したもの

    Use Slack ChatOps to Deploy Your Code – How to Integrate Your Pipeline in AWS CodePipeline with Your Slack Channel https://aws.amazon.com/blogs/devops/use-slack-chatops-to-deploy-your-code-how-to-integrate-your-pipeline-in-aws-codepipeline-with-your-slack-channel/
  31. Copyright © 2019 Studist Corporation. All Rights Reserved 31 仕組みの説明

    GitHub で PullRequest が master にマージされると、CodePipeline が動作開始
  32. Copyright © 2019 Studist Corporation. All Rights Reserved 32 仕組みの説明

    Production 同等環境へのデプロイが完了すると、承認ボタンが発行される CodePiepline を Publisher として指定している SNS topic に通知
  33. Copyright © 2019 Studist Corporation. All Rights Reserved 33 仕組みの説明

    SNS topic が登録されると、Lambda に通知を送信
  34. Copyright © 2019 Studist Corporation. All Rights Reserved 34 Amazon

    SNS • スケーラブルなPub/Subサービス • At Least Once デリバリーを保証 ◦ 複数のサーバーにメッセージを格納する • スロットリングが行われていて、 Lambda が届けられなかったメッセージの再試行もできる
  35. Copyright © 2019 Studist Corporation. All Rights Reserved Amazon SNS

    Subscriber 35 Publisher SNS topic Lambda Email SMS SQS HTTP/S
  36. Copyright © 2019 Studist Corporation. All Rights Reserved 今回の実装ケース Subscriber

    36 Publisher SNS topic Lambda Email SMS SQS HTTP/S 承認ボタン発行イベントを 受け取る
  37. Copyright © 2019 Studist Corporation. All Rights Reserved 37 ApprovalRequester

    Lambda function
  38. Copyright © 2019 Studist Corporation. All Rights Reserved 38 仕組みの説明

    Lambda が、SNS のイベントを受け取り、Slack の Incoming Webhook を叩く →承認ボタンが Slack に投稿される
  39. Copyright © 2019 Studist Corporation. All Rights Reserved 39 ApprovalRequester

    Lambda function def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) message = event["Records"][0]["Sns"]["Message"] data = json.loads(message) token = data["approval"]["token"] codepipeline_name = data["approval"]["pipelineName"] (SNS が送信する)CodePipeline の承認ボタンのイベントを受け取る
  40. Copyright © 2019 Studist Corporation. All Rights Reserved 40 ApprovalRequester

    Lambda function def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) message = event["Records"][0]["Sns"]["Message"] data = json.loads(message) token = data["approval"]["token"] codepipeline_name = data["approval"]["pipelineName"] (SNS が送信する)CodePipeline の承認ボタンのイベントを受け取る AWS Lambda は event を使用して イベントデータをハンドラに渡す 通常、Python の dict タイプ ※ list、str、int、float 等も使用可
  41. Copyright © 2019 Studist Corporation. All Rights Reserved 41 ApprovalRequester

    Lambda function 承認ボタンのイベントを Slack に送信する req = Request(SLACK_WEBHOOK_URL,json.dumps(slack_message).encode('utf-8')) response = urlopen(req) response.read() return None
  42. Copyright © 2019 Studist Corporation. All Rights Reserved 42 ApprovalRequester

    Lambda function 承認ボタンのイベントを Slack に送信する req = Request(SLACK_WEBHOOK_URL,json.dumps(slack_message).encode('utf-8')) response = urlopen(req) response.read() return None Incoming Webhook 用 URL を 環境変数に格納 ※ Incoming Webhook は後述
  43. Copyright © 2019 Studist Corporation. All Rights Reserved 43 ApprovalRequester

    Lambda function 承認ボタンのイベントを Slack に送信する req = Request(SLACK_WEBHOOK_URL,json.dumps(slack_message).encode('utf-8')) response = urlopen(req) response.read() return None slack_message の中に 投稿メッセージを定義する
  44. Copyright © 2019 Studist Corporation. All Rights Reserved 44 Slack

    App • Slack 連携したアプリを作成したり、 公開済アプリを install したりできる • Slack App Directory で、 公開済 Slack App を検索 & install 可 • 今回は、自分たちだけが利用する Slack App を作成 Slack App の機能一覧
  45. Copyright © 2019 Studist Corporation. All Rights Reserved 45 Slack

    App の機能をいくつか紹介 • Incoming Webhooks ◦ 外部システムから、Slack にメッセージを投稿する • Interactive Components ◦ ユーザーアクションを求めるボタンなどの対話型メッセージをつくる • Slash Commands ◦ /(スラッシュ)からはじまる特殊コマンドを拡張するための機能 • Bot Users ◦ Slack 上でユーザーのように振る舞うボットを作成できる ▪ 名前やプロフィール情報を持ち、チャンネルにも参加できる
  46. Copyright © 2019 Studist Corporation. All Rights Reserved 46 Slack

    App の作成 https://api.slack.com/apps から、「Create New App」
  47. Copyright © 2019 Studist Corporation. All Rights Reserved 47 Slack

    App の作成 https://api.slack.com/apps から、「Create New App」 開発するワークスペース 今回のケースであれば、 承認ボタンを通知したい ワークスペースを指定すればOK
  48. Copyright © 2019 Studist Corporation. All Rights Reserved 48 (例)Incoming

    Webhook の URL を発行する 1. 「Activate Incoming Webhooks」を有効に 2. 「Add New Webhook to Workspace」
  49. Copyright © 2019 Studist Corporation. All Rights Reserved 49 仕組みの説明

    Slack 上で、 CodePipeline の承認ボタンを押す(承認 or 却下)
  50. Copyright © 2019 Studist Corporation. All Rights Reserved 50 前述の

    slack_message に定義した通りにアクションが展開される
  51. Copyright © 2019 Studist Corporation. All Rights Reserved 51 前述の

    slack_message に定義した通りにアクションが展開される ボタンを選択すると、 API Gateway に HTTP POST を 投げる Request URL の詳細は後述
  52. Copyright © 2019 Studist Corporation. All Rights Reserved 52 Slack

    の message format • 基本 ◦ https://api.slack.com/docs/message-formatting • 今回利用するメッセージボタン ◦ https://api.slack.com/docs/message-buttons • Message Builder を利用すると捗る
  53. Copyright © 2019 Studist Corporation. All Rights Reserved 53 仕組みの説明

    承認ボタンのイベント対応結果を、 API Gateway に call back する
  54. Copyright © 2019 Studist Corporation. All Rights Reserved 54 Amazon

    API Gateway • API の作成と管理・実行をするマネージドサービス • HTTP/REST APIs と WebSocket APIs をサポート • Lambda と統合できる ◦ API Gateway が受け取ったリクエストを イベントオブジェクトとして Lambda にわたすことができる ▪ 今回も、この統合機能を利用する • https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/getting-started.html
  55. Copyright © 2019 Studist Corporation. All Rights Reserved 55 Amazon

    API Gateway 1. リソースを作成 2. POST メソッドを作成(Lambda統合で、後述する関数を指定する) 3. ステージにデプロイする 4. リクエストの URL をコピーし、 Slack App の Interactive Components の呼び出し URL として指定
  56. Copyright © 2019 Studist Corporation. All Rights Reserved 56 仕組みの説明

    API Gateway が、Lambda に結果を送信
  57. Copyright © 2019 Studist Corporation. All Rights Reserved 57 仕組みの説明

    Lambda が、受け取ったイベントをもとに、 CodePipeline の状態を更新(承認 or 却下)
  58. Copyright © 2019 Studist Corporation. All Rights Reserved 58 ApprovalHandler

    Lambda function 1. event を受け取り、CodePipeline の情報を取り出す 2. Slack の Verification Token を検証する 3. 問題がなければ、boto3 の CodePipeline クライアント で、 承認イベントを実行する(承認 or 拒否)
  59. Copyright © 2019 Studist Corporation. All Rights Reserved Verification Token

    は、 Slack App の Basic Information から確認する Lambda の環境変数に格納しておき 検証を行う 59 Slack の Verification Token
  60. Copyright © 2019 Studist Corporation. All Rights Reserved 60 ApprovalRequester

    Lambda function client = boto3.client('codepipeline') response_approval = client.put_approval_result( pipelineName=codepipeline_name, stageName='Approval', actionName='ApprovalOrDeny', result={'summary':'','status':codepipeline_status}, token=token) boto3 の CodePipeline クライアントの使い方
  61. Copyright © 2019 Studist Corporation. All Rights Reserved 61 話すこと

    なにをつくったか?なぜつくったか? STEP 1 どうやってつくったか?〜サーバーレスアーキテクチャ編〜 STEP 2 どうやってつくったか?〜Slack App 編〜 STEP 3 まとめ STEP 4 Agenda
  62. Copyright © 2019 Studist Corporation. All Rights Reserved 62 DevOps(ちょっとだけ)

    Slack App (おさらい)テーマ サーバーレスアーキテクチャ 1 2 3
  63. Copyright © 2019 Studist Corporation. All Rights Reserved 63 さいごに

    • 一通りぜんぶ知ってると実装が捗る ◦ “一通りぜんぶ知ってる” のハードルを越えるために、 今回の発表がお役に立てればめちゃ嬉しいです • 今日は IAM 権限まわりなど、細部の説明はぜんぶ飛ばしましたが、 手を動かしてみて不明点ある方は、ご連絡いただけると → @katsuhisa__
  64. Copyright © 2019 Studist Corporation. All Rights Reserved 64 さいごに

    • ChatOps で何を実現するか ◦ すべての API を ChatOps で叩くことが本当に幸せなのか ◦ 2019年4月現在の自分の思想としては、 できるだけ、GitOps の世界観に寄り添いたい ▪ GitOps の世界観 ≒ declarative な infra を目指す世界観 • とはいえ、ChatOps 自体が、ダメなわけではない ◦ 結局だいじなのは「何を実現するか」「なぜ ChatOps でやるか」 ◦ インフラのアーキテクチャによっても、 どこまで ChatOps にすると幸せか?は違う
  65. Copyright © 2019 Studist Corporation. All Rights Reserved 65 さいごに

    常に正しいことはないので、 今の自分たちにとって正しそうなことを選択して、 しあわせな ChatOps ライフを
  66. Copyright © 2019 Studist Corporation. All Rights Reserved 66 We

    are hiring! “伝えることを、もっと簡単に。” https://studist.jp/