☔
Slack Bolt for Python のクレデンシャル情報を AWS Systems Manager のパラメータストアに保管する
はじめに
こんにちは、クラスメソッド サービスグロースチームの筧です。
チーム内で、Bolt を使った Slack アプリ開発をやり始めたので学んだことをアウトプットします。
今回は、Slack アプリで払い出したクレデンシャルを、AWS Systems Manager のパラメータストアに保管する方法をご紹介します。
使うもの
前提
- Bot User OAuth Token:
-
token
に指定する値:"xxxxx"
(仮)
-
- Signing Secret:
-
signing_secret
に指定する値:"yyyyy"
(仮)
-
上記のクレデンシャル情報を、下記のコードのようにベタ書きせず、AWS Systems Managerのパラメータストアから呼び出せるようにすることをスコープとします。
app.py
from slack_bolt import App
from slack_bolt.adapter.aws_lambda import SlackRequestHandler
app = App(
process_before_response=True,
token="xxxxx",
signing_secret="yyyyy",
)
"""
リスナー関数はここに書く
"""
def handler(event, context):
slack_handler = SlackRequestHandler(app=app)
return slack_handler.handle(event, context)
やっていく
AWS Systems Manager のパラメータストアに保存
パラメータストアに以下の名前でクレデンシャル情報を保存します。
- Bot User OAuth Token:
token
-
/サービス名/ステージ名/SLACK_BOT_TOKEN
- ex)
/developersio2022-slack-bolt-app/dev/SLACK_BOT_TOKEN
- ex)
-
- Signing Secret:
signing_secret
-
/サービス名/ステージ名/SLACK_BOT_SIGNING_SECRET
- ex)
/developersio2022-slack-bolt-app/dev/SLACK_BOT_SIGNING_SECRET
- ex)
-
Lambda の環境変数を参照
一旦、Lambda のコード上で、token
とsigning_secret
が環境変数を参照するようにします。
app.py
from slack_bolt import App
from slack_bolt.adapter.aws_lambda import SlackRequestHandler
app = App(
process_before_response=True,
token=os.environ["SLACK_BOT_TOKEN"],
signing_secret=os.environ["SLACK_BOT_SIGNING_SECRET"],
)
"""
リスナー関数はここに書く
"""
def handler(event, context):
slack_handler = SlackRequestHandler(app=app)
return slack_handler.handle(event, context)
serverless.yml 上でパラメータストアを参照
You can reference SSM Parameters as the source of your variables with the ssm:/path/to/param syntax.
上記公式ドキュメントの通り、Serverless Framework で用意されている構文を使うことで、serverless.yml から簡単にパラメータストアに保管したクレデンシャル情報を参照できます。なお、IAM ロールssm:GetParameter
の許可もあわせて必要です。
以下は上記を踏まえた、serverless.yml の例です。
serverless.yml
service: developersio2022-slack-bolt-app
frameworkVersion: '3'
provider:
name: aws
runtime: python3.9
lambdaHashingVersion: 20201221
stage: ${opt:stage, 'dev'}
region: ${opt:region, "ap-northeast-1"}
# ・・snip・・
iam:
role:
statements:
- Effect: 'Allow'
Action:
- ssm:GetParameter
# ・・snip・・
environment: ${self:custom.environment.${self:provider.stage}}
# ・・snip・・
custom:
environment:
dev:
SLACK_BOT_TOKEN: ${ssm(${self:provider.region}):/${self:service}/${self:provider.stage}/SLACK_BOT_TOKEN}
SLACK_BOT_SIGNING_SECRET: ${ssm(${self:provider.region}):/${self:service}/${self:provider.stage}/SLACK_BOT_SIGNING_SECRET}
prod:
# ・・snip・・
おわりに
最後まで読んでいただきありがとうございます。
上記イベントで、Slack Bolt 関連のセッションでオンライン登壇しました。
よかったらこちらも御覧ください!
動画
関連ブログ
それではまた!
Discussion