Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS サーバーレスアーキテクチャでつくる Slack ChatOps

AWS サーバーレスアーキテクチャでつくる Slack ChatOps

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

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

katsuhisa_

April 08, 2019
Tweet

More Decks by katsuhisa_

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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/

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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/

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide