Slide 1

Slide 1 text

Copyright © 2019 Studist Corporation. All Rights Reserved AWS サーバーレスアーキテクチャでつくる Slack App 株式会社スタディスト 北野 勝久 サポーターズコラボ勉強会 2019/04/08

Slide 2

Slide 2 text

Copyright © 2019 Studist Corporation. All Rights Reserved 2 #spzcolab イベントハッシュタグ

Slide 3

Slide 3 text

Copyright © 2019 Studist Corporation. All Rights Reserved 3 北野 勝久 / @katsuhisa__ Katsuhisa Kitano 株式会社スタディスト 開発部 SRE Organizer of SRE Lounge Developers Summit 登壇 etc...

Slide 4

Slide 4 text

Copyright © 2019 Studist Corporation. All Rights Reserved 4 “伝えることを、もっと簡単に。” https://studist.jp/ 会社紹介

Slide 5

Slide 5 text

Copyright © 2019 Studist Corporation. All Rights Reserved 5 サービス紹介

Slide 6

Slide 6 text

Copyright © 2019 Studist Corporation. All Rights Reserved 6 サーバーレスでの Slack App のつくりかたを知る 本日のゴール

Slide 7

Slide 7 text

Copyright © 2019 Studist Corporation. All Rights Reserved 7 DevOps(ちょっとだけ) Slack App テーマ サーバーレスアーキテクチャ 1 2 3

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Copyright © 2019 Studist Corporation. All Rights Reserved 9 話さないこと ● AWSの基本知識 ● Slack の基本的な使い方や用語 ● AWS Lambda のコード管理や、CI/CD ● AWS SAM(サーバーレスアプリケーションモデル)や サーバーレスフレームワーク

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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/

Slide 12

Slide 12 text

Copyright © 2019 Studist Corporation. All Rights Reserved 12 今回実装したもの

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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 マージ権限を持つ 開発者が行う

Slide 16

Slide 16 text

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 権限のみ付与を基本方針と しているため

Slide 17

Slide 17 text

Copyright © 2019 Studist Corporation. All Rights Reserved 17 課題感 理想状態に思いを馳せる

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Copyright © 2019 Studist Corporation. All Rights Reserved 19 やりたかったこと 開発者がデプロイに責任を持てるようにしたい

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Copyright © 2019 Studist Corporation. All Rights Reserved 21 どうやって実現するか CodePipeline と Slack のやり取りどうする?

Slide 22

Slide 22 text

Copyright © 2019 Studist Corporation. All Rights Reserved 22 今回のユースケースの特徴 「サーバーレスアーキテクチャで実装しよう」

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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/

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Copyright © 2019 Studist Corporation. All Rights Reserved 33 仕組みの説明 SNS topic が登録されると、Lambda に通知を送信

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Copyright © 2019 Studist Corporation. All Rights Reserved Amazon SNS Subscriber 35 Publisher SNS topic Lambda Email SMS SQS HTTP/S

Slide 36

Slide 36 text

Copyright © 2019 Studist Corporation. All Rights Reserved 今回の実装ケース Subscriber 36 Publisher SNS topic Lambda Email SMS SQS HTTP/S 承認ボタン発行イベントを 受け取る

Slide 37

Slide 37 text

Copyright © 2019 Studist Corporation. All Rights Reserved 37 ApprovalRequester Lambda function

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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 の承認ボタンのイベントを受け取る

Slide 40

Slide 40 text

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 等も使用可

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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 は後述

Slide 43

Slide 43 text

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 の中に 投稿メッセージを定義する

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

Copyright © 2019 Studist Corporation. All Rights Reserved 48 (例)Incoming Webhook の URL を発行する 1. 「Activate Incoming Webhooks」を有効に 2. 「Add New Webhook to Workspace」

Slide 49

Slide 49 text

Copyright © 2019 Studist Corporation. All Rights Reserved 49 仕組みの説明 Slack 上で、 CodePipeline の承認ボタンを押す(承認 or 却下)

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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 を利用すると捗る

Slide 53

Slide 53 text

Copyright © 2019 Studist Corporation. All Rights Reserved 53 仕組みの説明 承認ボタンのイベント対応結果を、 API Gateway に call back する

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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 クライアントの使い方

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

Copyright © 2019 Studist Corporation. All Rights Reserved 62 DevOps(ちょっとだけ) Slack App (おさらい)テーマ サーバーレスアーキテクチャ 1 2 3

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

Copyright © 2019 Studist Corporation. All Rights Reserved 66 We are hiring! “伝えることを、もっと簡単に。” https://studist.jp/