SlideShare a Scribd company logo
1 of 12
Download to read offline
SlackのSlash command
の処理をAWS Lambda
で実装してみました
株式会社サイタスマネジメント
米田 真治
1
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8
自己紹介
• 米田 真治 (こめだ しんじ)
– 株式会社サイタスマネジメント CTO
– 運用エンジニア
• 経歴
– 学生時代にUNIXに出会う
– Internetにつながる環境がきた
– いろんなプログラムをビルドしているうちに、
開発・構築の楽しさに目覚める
– 学科のシステム管理を経験
– システム運用のおもしろさを覚える
– 就職してISPのサーバ構築・運用に携わる
– 2000年6月 サイタスマネジメント創業
2016/04/20OSS運用管理勉強会
2
全体像
3
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8
利用したblueprint
• slack-­echo-­command-­python
Slack 側は Custom Integrations の Slash Commands を
使用します。
• cloudwatch-­alarm-­to-­slack-­python
event['Records'][0]['Sns']['Message']からメッセー
ジを取り出します。
Incoming Webhooks でなく response_url を使って応答を
返すように修正しました。
4
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8
シナリオ
Slack → API Gateway → Lambda
Slack 側では Slash Commands を使用します。
Lambda 関数の処理では 3 秒以内にSlack 側へ応答を返す必要があります。
時間がかかる処理を行うために、Lambda で受信したコマンドは、
SNS を経由して別の Lambda 関数をイベント起動します。
5
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8
シナリオ
Lambda → SNS → Lambda → Slack
SNS イベントから起動される Lambda 関数では STS を利用して、
Slash Command を発行したユーザのロールを引き受けてAPI コマンドを実行します。
{
"user_name":  "komeda",  
"command":  "/lambda",  
"channel":  "genral",  
"command_text":  "ec2  start  i-­‐xxxxxxxx",  
"response_url":  "https://...."
}
6
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8
API Gatewayの
設定
7
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8
lambda-bot関数概要
def lambda_handler(event,  context):
req_body =  event['body']
params =  parse_qs(req_body)
トークンチェック
引数取りだし
arg =  command_text.split('  ')
if  arg[0]  in  ['ec2',  's3']:
sns =  boto3.client('sns')
topic_arn =  sns.create_topic(Name='sns-­‐lambda')['TopicArn']
message={"user_name":  user,  "command":  command,  "channel":  channel,  "command_text":  com
mand_text,  "response_url":  response_url}
message=json.dumps(message)
message=json.dumps({'default':  message,  'lambda':  message})
response  =  sns.publish(
TopicArn=topic_arn,
Subject='/lambda',
MessageStructure='json',
Message=message
)
return  {  "text":  "%s  %s¥nroger"  %  (command,  command_text)  }
elif arg[0]  ==  'help':
return  {  "text":  "ec2  [console|start|stop instance-­‐id]¥ns3  [usage  bucket]"  }
else:
return  {  "text":  "%s  invoked  %s  in  %s  with  the  following  text:  %s"  %  (user,  command,  ch
annel,  command_text)  }
8
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8
notify-to-slack関数概要
def lambda_handler(event,  context):
message  =  event['Records'][0]['Sns']['Message']
logger.info("Event:  "  +  str(message))
if  True:
message  =  json.loads(message)
引数取りだし
arg =  command_text.split('  ')
slack_message =  {
'channel':  '@%s'  %  user_name, 'response_type':  'ephemeral', #  or  'in_channel'
'isDelayedResponse':  'true',
'text':  "%s  %s"  %  (command,  command_text)
}
if  arg[0]  ==  'ec2':
slack_message['text']  =  ec2_command(arg,  user_name,  response_url)
send_response(response_url,  slack_message)
elif arg[0]  ==  's3':
slack_message['text']  =  s3_command(arg,  user_name,  response_url)
send_response(response_url,  slack_message)
else:
slack_message =  {  'text':  "command  failed"  }
send_response(response_url,  slack_message)
9
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8
STSでの権限の引き受け
ポリシー名とロール名をハードコードしています。ほかに良い方法があれば…
iam =  boto3.client('iam')
response  =  iam.get_user(UserName=user_name)
if  response.has_key('User'):
uid =  response['User']['Arn'].split(':')[4]
if  uid and  boto3.resource('iam').UserPolicy(user_name,  'ec2-­‐full-­‐access'):
response  =  iam.get_role(RoleName='virginia-­‐ec2-­‐delegate')
if  response.has_key('Role'):
sts =  boto3.client('sts')
assumedRoleObject =  sts.assume_role(RoleArn="arn:aws:iam::%s:role/%s"  %  
(uid,  'virginia-­‐ec2-­‐delegate'),  RoleSessionName='session')
credentials  =  assumedRoleObject['Credentials']
ec2  =  boto3.resource(
'ec2',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token =  credentials['SessionToken'],
)
10
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8
response_urlに応答を返す
def send_response(response_url,  message):
req =  Request(response_url)
req.add_header('Content-­‐Type',  'application/json')
try:
response  =  urlopen(req,  json.dumps(message))
response.read()
except  HTTPError as  e:
logger.error("Request  failed:  %d  %s",  e.code,  e.reason)
except  URLError as  e:
logger.error("Server  connection  failed:  %s",  e.reason)
11
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8
課題
• 認証
– いまのところ、Slackのユーザ名をAWSのユーザ名に対応づけて
扱っています。
– コマンド実行のときは、できればユーザ認証をしたい。
– MFAできればよいけれど… …
– Cognitoの新機能「User Pools」を使えばMFAできるの?
• STS
– ポリシー名とロール名をハードコードしているところ、
ユーザが持っている権限をチェックできた方がよい。
– 実用上はハードコードでもかまわない?
12
2016/4/22
JAWS-UGアーキテクチャ専門支部クラウドネイティブ
分科会CDP議論会#8

More Related Content

What's hot

ワタシハ Azure Functions チョットデキル
ワタシハ Azure Functions チョットデキルワタシハ Azure Functions チョットデキル
ワタシハ Azure Functions チョットデキルTsuyoshi Ushio
 
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)Toru Makabe
 
Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊Toru Makabe
 
Performance and Scalability of Web Service
Performance and Scalability of Web ServicePerformance and Scalability of Web Service
Performance and Scalability of Web ServiceShinji Tanaka
 
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話Shingo Kawahara
 
AWSを含めたハイブリッド環境の監視の実現 ~zabbixのクラウド対応モジュールHyClops~
AWSを含めたハイブリッド環境の監視の実現 ~zabbixのクラウド対応モジュールHyClops~AWSを含めたハイブリッド環境の監視の実現 ~zabbixのクラウド対応モジュールHyClops~
AWSを含めたハイブリッド環境の監視の実現 ~zabbixのクラウド対応モジュールHyClops~Daisuke Ikeda
 
クラウド案件の作り方 for azureしなの4周年
クラウド案件の作り方 for azureしなの4周年クラウド案件の作り方 for azureしなの4周年
クラウド案件の作り方 for azureしなの4周年Kuniteru Asami
 
Getting Started With AKS
Getting Started With AKSGetting Started With AKS
Getting Started With AKSBalaji728392
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)さくらインターネット株式会社
 
俺的 Ignite 2021 Fall Update まとめ
 俺的 Ignite 2021 Fall Update まとめ 俺的 Ignite 2021 Fall Update まとめ
俺的 Ignite 2021 Fall Update まとめYui Ashikaga
 
Understanding Azure Application Gateway
Understanding Azure Application GatewayUnderstanding Azure Application Gateway
Understanding Azure Application GatewayKuniteru Asami
 
AKSを活用した社内向けイベント支援プラットフォームをリリースした話
AKSを活用した社内向けイベント支援プラットフォームをリリースした話AKSを活用した社内向けイベント支援プラットフォームをリリースした話
AKSを活用した社内向けイベント支援プラットフォームをリリースした話Shingo Kawahara
 
俺の Kubernetes Workflow with HashiStack
俺の Kubernetes Workflow with HashiStack俺の Kubernetes Workflow with HashiStack
俺の Kubernetes Workflow with HashiStackToru Makabe
 
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceToru Makabe
 
サーバ構築・デプロイが簡単に!Elastic beanstalk
サーバ構築・デプロイが簡単に!Elastic beanstalkサーバ構築・デプロイが簡単に!Elastic beanstalk
サーバ構築・デプロイが簡単に!Elastic beanstalkHirokazu Ouchi
 
Azure Stack Hybrid DevOpsデモンストレーション
Azure Stack Hybrid DevOpsデモンストレーションAzure Stack Hybrid DevOpsデモンストレーション
Azure Stack Hybrid DevOpsデモンストレーションMasahiko Ebisuda
 
NoOpsへ舵を切れ
NoOpsへ舵を切れNoOpsへ舵を切れ
NoOpsへ舵を切れHiromasa Oka
 

What's hot (19)

ワタシハ Azure Functions チョットデキル
ワタシハ Azure Functions チョットデキルワタシハ Azure Functions チョットデキル
ワタシハ Azure Functions チョットデキル
 
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)
 
Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊Azure Infrastructure as Code 体験入隊
Azure Infrastructure as Code 体験入隊
 
Performance and Scalability of Web Service
Performance and Scalability of Web ServicePerformance and Scalability of Web Service
Performance and Scalability of Web Service
 
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話
July Tech Festa 2020 AKSを活用した内製教育支援プラットフォームをリリースした話
 
AWSを含めたハイブリッド環境の監視の実現 ~zabbixのクラウド対応モジュールHyClops~
AWSを含めたハイブリッド環境の監視の実現 ~zabbixのクラウド対応モジュールHyClops~AWSを含めたハイブリッド環境の監視の実現 ~zabbixのクラウド対応モジュールHyClops~
AWSを含めたハイブリッド環境の監視の実現 ~zabbixのクラウド対応モジュールHyClops~
 
クラウド案件の作り方 for azureしなの4周年
クラウド案件の作り方 for azureしなの4周年クラウド案件の作り方 for azureしなの4周年
クラウド案件の作り方 for azureしなの4周年
 
Getting Started With AKS
Getting Started With AKSGetting Started With AKS
Getting Started With AKS
 
Non-coding! Azure
Non-coding! AzureNon-coding! Azure
Non-coding! Azure
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
Docker ホスティングサービス 'Arukas' での Mesos + Marathon の活用について(Mesos勉強会)
 
俺的 Ignite 2021 Fall Update まとめ
 俺的 Ignite 2021 Fall Update まとめ 俺的 Ignite 2021 Fall Update まとめ
俺的 Ignite 2021 Fall Update まとめ
 
Understanding Azure Application Gateway
Understanding Azure Application GatewayUnderstanding Azure Application Gateway
Understanding Azure Application Gateway
 
AKSを活用した社内向けイベント支援プラットフォームをリリースした話
AKSを活用した社内向けイベント支援プラットフォームをリリースした話AKSを活用した社内向けイベント支援プラットフォームをリリースした話
AKSを活用した社内向けイベント支援プラットフォームをリリースした話
 
俺の Kubernetes Workflow with HashiStack
俺の Kubernetes Workflow with HashiStack俺の Kubernetes Workflow with HashiStack
俺の Kubernetes Workflow with HashiStack
 
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes Service
 
サーバ構築・デプロイが簡単に!Elastic beanstalk
サーバ構築・デプロイが簡単に!Elastic beanstalkサーバ構築・デプロイが簡単に!Elastic beanstalk
サーバ構築・デプロイが簡単に!Elastic beanstalk
 
Azure Stack Hybrid DevOpsデモンストレーション
Azure Stack Hybrid DevOpsデモンストレーションAzure Stack Hybrid DevOpsデモンストレーション
Azure Stack Hybrid DevOpsデモンストレーション
 
NoOpsへ舵を切れ
NoOpsへ舵を切れNoOpsへ舵を切れ
NoOpsへ舵を切れ
 

Viewers also liked

CentOS6 でも Zabbix 3.0 を動かしたい
CentOS6 でも Zabbix 3.0 を動かしたいCentOS6 でも Zabbix 3.0 を動かしたい
CentOS6 でも Zabbix 3.0 を動かしたい真治 米田
 
OSC 2014 Tokyo/Spring 「Zabbix 2.2を使ってみよう」
OSC 2014 Tokyo/Spring 「Zabbix 2.2を使ってみよう」OSC 2014 Tokyo/Spring 「Zabbix 2.2を使ってみよう」
OSC 2014 Tokyo/Spring 「Zabbix 2.2を使ってみよう」Atsushi Tanaka
 
ChatOpsでシステムの運用が改善された話
ChatOpsでシステムの運用が改善された話ChatOpsでシステムの運用が改善された話
ChatOpsでシステムの運用が改善された話Shinya Takara
 
VyOS Users Meeting #2, VyOSのVXLANの話
VyOS Users Meeting #2, VyOSのVXLANの話VyOS Users Meeting #2, VyOSのVXLANの話
VyOS Users Meeting #2, VyOSのVXLANの話upaa
 
TranslimitのChatOps事情と愉快なbotたち
TranslimitのChatOps事情と愉快なbotたちTranslimitのChatOps事情と愉快なbotたち
TranslimitのChatOps事情と愉快なbotたちMasakazu Matsushita
 
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)さくらインターネット株式会社
 
Slackから始めるChatOps
Slackから始めるChatOpsSlackから始めるChatOps
Slackから始めるChatOpsYuto Suzuki
 
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~真乙 九龍
 
Fleegestatioun 2014 version4
Fleegestatioun 2014 version4Fleegestatioun 2014 version4
Fleegestatioun 2014 version4Luxemburger Wort
 
HHMI PHAGES lab at OBU
HHMI PHAGES lab at OBUHHMI PHAGES lab at OBU
HHMI PHAGES lab at OBUplymaler
 
37324 cij job_etudiant_int_finale
37324 cij job_etudiant_int_finale37324 cij job_etudiant_int_finale
37324 cij job_etudiant_int_finaleLuxemburger Wort
 
How send deliverables
How send deliverablesHow send deliverables
How send deliverablesUBDP
 

Viewers also liked (20)

CentOS6 でも Zabbix 3.0 を動かしたい
CentOS6 でも Zabbix 3.0 を動かしたいCentOS6 でも Zabbix 3.0 を動かしたい
CentOS6 でも Zabbix 3.0 を動かしたい
 
OSC 2014 Tokyo/Spring 「Zabbix 2.2を使ってみよう」
OSC 2014 Tokyo/Spring 「Zabbix 2.2を使ってみよう」OSC 2014 Tokyo/Spring 「Zabbix 2.2を使ってみよう」
OSC 2014 Tokyo/Spring 「Zabbix 2.2を使ってみよう」
 
ChatOpsでシステムの運用が改善された話
ChatOpsでシステムの運用が改善された話ChatOpsでシステムの運用が改善された話
ChatOpsでシステムの運用が改善された話
 
VyOS Users Meeting #2, VyOSのVXLANの話
VyOS Users Meeting #2, VyOSのVXLANの話VyOS Users Meeting #2, VyOSのVXLANの話
VyOS Users Meeting #2, VyOSのVXLANの話
 
TranslimitのChatOps事情と愉快なbotたち
TranslimitのChatOps事情と愉快なbotたちTranslimitのChatOps事情と愉快なbotたち
TranslimitのChatOps事情と愉快なbotたち
 
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
 
Slackから始めるChatOps
Slackから始めるChatOpsSlackから始めるChatOps
Slackから始めるChatOps
 
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
 
Fragebogen
FragebogenFragebogen
Fragebogen
 
Pdf gr mamer_27012014
Pdf gr mamer_27012014Pdf gr mamer_27012014
Pdf gr mamer_27012014
 
Fleegestatioun 2014 version4
Fleegestatioun 2014 version4Fleegestatioun 2014 version4
Fleegestatioun 2014 version4
 
EBA report - Bankers 2013
EBA report - Bankers 2013EBA report - Bankers 2013
EBA report - Bankers 2013
 
Asa yang tlah
Asa yang tlahAsa yang tlah
Asa yang tlah
 
HHMI PHAGES lab at OBU
HHMI PHAGES lab at OBUHHMI PHAGES lab at OBU
HHMI PHAGES lab at OBU
 
Ssmn pdf
Ssmn pdfSsmn pdf
Ssmn pdf
 
37324 cij job_etudiant_int_finale
37324 cij job_etudiant_int_finale37324 cij job_etudiant_int_finale
37324 cij job_etudiant_int_finale
 
Open Market Index
Open Market IndexOpen Market Index
Open Market Index
 
Projek 3 media
Projek 3 mediaProjek 3 media
Projek 3 media
 
Communiqué bettembourg
Communiqué bettembourgCommuniqué bettembourg
Communiqué bettembourg
 
How send deliverables
How send deliverablesHow send deliverables
How send deliverables
 

Similar to SlackのSlash commandの処理をAWS Lambdaで実装してみました

Azure Machine Learning Services 概要 - 2019年2月版
Azure Machine Learning Services 概要 - 2019年2月版Azure Machine Learning Services 概要 - 2019年2月版
Azure Machine Learning Services 概要 - 2019年2月版Daiyu Hatakeyama
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013Takashi Someda
 
ホット・トピック・セミナー「Metro」
ホット・トピック・セミナー「Metro」ホット・トピック・セミナー「Metro」
ホット・トピック・セミナー「Metro」Kohsuke Kawaguchi
 
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドMicrosoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドKazumi Hirose
 
本気で使うStack storm
本気で使うStack storm本気で使うStack storm
本気で使うStack stormtyamane
 
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Shotaro Suzuki
 
Microsoft AI セミナー - Microsoft AI Platform
Microsoft AI セミナー - Microsoft AI PlatformMicrosoft AI セミナー - Microsoft AI Platform
Microsoft AI セミナー - Microsoft AI PlatformDaiyu Hatakeyama
 
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説Takao Tetsuro
 
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 Daiyu Hatakeyama
 
Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理Tusyoshi Matsuzaki
 
AWS SAMで始めるサーバーレスアプリケーション開発
AWS SAMで始めるサーバーレスアプリケーション開発AWS SAMで始めるサーバーレスアプリケーション開発
AWS SAMで始めるサーバーレスアプリケーション開発真吾 吉田
 
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話Hibino Hisashi
 
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編Daiyu Hatakeyama
 
20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-public20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-publicAmazon Web Services Japan
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpMasahito Zembutsu
 
サーバーレスの今とこれから
サーバーレスの今とこれからサーバーレスの今とこれから
サーバーレスの今とこれから真吾 吉田
 
20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会samemoon
 

Similar to SlackのSlash commandの処理をAWS Lambdaで実装してみました (20)

Azure Machine Learning Services 概要 - 2019年2月版
Azure Machine Learning Services 概要 - 2019年2月版Azure Machine Learning Services 概要 - 2019年2月版
Azure Machine Learning Services 概要 - 2019年2月版
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013
AWS を活用して小さなチームで 世界で使われるサービスを運用する方法 - JAWS Days 2013
 
ホット・トピック・セミナー「Metro」
ホット・トピック・セミナー「Metro」ホット・トピック・セミナー「Metro」
ホット・トピック・セミナー「Metro」
 
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスドMicrosoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
Microsoft azure上にwebサイトやアプリケーションを構築する方法 アドバンスド
 
Vue.js で XSS
Vue.js で XSSVue.js で XSS
Vue.js で XSS
 
本気で使うStack storm
本気で使うStack storm本気で使うStack storm
本気で使うStack storm
 
Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...Building React, Flutter and Blazor development and debugging environment with...
Building React, Flutter and Blazor development and debugging environment with...
 
Microsoft AI セミナー - Microsoft AI Platform
Microsoft AI セミナー - Microsoft AI PlatformMicrosoft AI セミナー - Microsoft AI Platform
Microsoft AI セミナー - Microsoft AI Platform
 
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
 
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要 第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
第29回 SQL Server 勉強会 (JSSUG) - Azure Synapse Analytics 概要
 
Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理Spark Analytics - スケーラブルな分散処理
Spark Analytics - スケーラブルな分散処理
 
AWS SAMで始めるサーバーレスアプリケーション開発
AWS SAMで始めるサーバーレスアプリケーション開発AWS SAMで始めるサーバーレスアプリケーション開発
AWS SAMで始めるサーバーレスアプリケーション開発
 
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
【第21回Elasticsearch勉強会】aws環境に合わせてelastic stackをログ分析基盤として構築した話
 
機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編機械学習 / Deep Learning 大全 (5) Tool編
機械学習 / Deep Learning 大全 (5) Tool編
 
20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-public20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-public
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
 
サーバーレスの今とこれから
サーバーレスの今とこれからサーバーレスの今とこれから
サーバーレスの今とこれから
 
20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会
 
Azure Datalake 大全
Azure Datalake 大全Azure Datalake 大全
Azure Datalake 大全
 

More from 真治 米田

何はともあれ、まず最初にやることといえばこれ
何はともあれ、まず最初にやることといえばこれ何はともあれ、まず最初にやることといえばこれ
何はともあれ、まず最初にやることといえばこれ真治 米田
 
JAWS-UG CLI 専門支部のハンズオンテキストを Jupyter Notebook 上で実行できるようにする
JAWS-UG CLI 専門支部のハンズオンテキストをJupyter Notebook 上で実行できるようにするJAWS-UG CLI 専門支部のハンズオンテキストをJupyter Notebook 上で実行できるようにする
JAWS-UG CLI 専門支部のハンズオンテキストを Jupyter Notebook 上で実行できるようにする真治 米田
 
GraphMLとNeo4jでやってみたいこと
GraphMLとNeo4jでやってみたいことGraphMLとNeo4jでやってみたいこと
GraphMLとNeo4jでやってみたいこと真治 米田
 
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話真治 米田
 
S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較真治 米田
 
OSSを用いた監視/運用ツールの運用課題について
OSSを用いた監視/運用ツールの運用課題についてOSSを用いた監視/運用ツールの運用課題について
OSSを用いた監視/運用ツールの運用課題について真治 米田
 
運用の現場での監視運用ツールの活用
運用の現場での監視運用ツールの活用運用の現場での監視運用ツールの活用
運用の現場での監視運用ツールの活用真治 米田
 
第2回 OSS運用管理勉強会 運用あるある(Zabbix)
第2回 OSS運用管理勉強会 運用あるある(Zabbix)第2回 OSS運用管理勉強会 運用あるある(Zabbix)
第2回 OSS運用管理勉強会 運用あるある(Zabbix)真治 米田
 

More from 真治 米田 (9)

何はともあれ、まず最初にやることといえばこれ
何はともあれ、まず最初にやることといえばこれ何はともあれ、まず最初にやることといえばこれ
何はともあれ、まず最初にやることといえばこれ
 
JAWS-UG CLI 専門支部のハンズオンテキストを Jupyter Notebook 上で実行できるようにする
JAWS-UG CLI 専門支部のハンズオンテキストをJupyter Notebook 上で実行できるようにするJAWS-UG CLI 専門支部のハンズオンテキストをJupyter Notebook 上で実行できるようにする
JAWS-UG CLI 専門支部のハンズオンテキストを Jupyter Notebook 上で実行できるようにする
 
Oss との関わり
Oss との関わりOss との関わり
Oss との関わり
 
GraphMLとNeo4jでやってみたいこと
GraphMLとNeo4jでやってみたいことGraphMLとNeo4jでやってみたいこと
GraphMLとNeo4jでやってみたいこと
 
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
 
S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較
 
OSSを用いた監視/運用ツールの運用課題について
OSSを用いた監視/運用ツールの運用課題についてOSSを用いた監視/運用ツールの運用課題について
OSSを用いた監視/運用ツールの運用課題について
 
運用の現場での監視運用ツールの活用
運用の現場での監視運用ツールの活用運用の現場での監視運用ツールの活用
運用の現場での監視運用ツールの活用
 
第2回 OSS運用管理勉強会 運用あるある(Zabbix)
第2回 OSS運用管理勉強会 運用あるある(Zabbix)第2回 OSS運用管理勉強会 運用あるある(Zabbix)
第2回 OSS運用管理勉強会 運用あるある(Zabbix)
 

SlackのSlash commandの処理をAWS Lambdaで実装してみました

  • 1. SlackのSlash command の処理をAWS Lambda で実装してみました 株式会社サイタスマネジメント 米田 真治 1 2016/4/22 JAWS-UGアーキテクチャ専門支部クラウドネイティブ 分科会CDP議論会#8
  • 2. 自己紹介 • 米田 真治 (こめだ しんじ) – 株式会社サイタスマネジメント CTO – 運用エンジニア • 経歴 – 学生時代にUNIXに出会う – Internetにつながる環境がきた – いろんなプログラムをビルドしているうちに、 開発・構築の楽しさに目覚める – 学科のシステム管理を経験 – システム運用のおもしろさを覚える – 就職してISPのサーバ構築・運用に携わる – 2000年6月 サイタスマネジメント創業 2016/04/20OSS運用管理勉強会 2
  • 4. 利用したblueprint • slack-­echo-­command-­python Slack 側は Custom Integrations の Slash Commands を 使用します。 • cloudwatch-­alarm-­to-­slack-­python event['Records'][0]['Sns']['Message']からメッセー ジを取り出します。 Incoming Webhooks でなく response_url を使って応答を 返すように修正しました。 4 2016/4/22 JAWS-UGアーキテクチャ専門支部クラウドネイティブ 分科会CDP議論会#8
  • 5. シナリオ Slack → API Gateway → Lambda Slack 側では Slash Commands を使用します。 Lambda 関数の処理では 3 秒以内にSlack 側へ応答を返す必要があります。 時間がかかる処理を行うために、Lambda で受信したコマンドは、 SNS を経由して別の Lambda 関数をイベント起動します。 5 2016/4/22 JAWS-UGアーキテクチャ専門支部クラウドネイティブ 分科会CDP議論会#8
  • 6. シナリオ Lambda → SNS → Lambda → Slack SNS イベントから起動される Lambda 関数では STS を利用して、 Slash Command を発行したユーザのロールを引き受けてAPI コマンドを実行します。 { "user_name":  "komeda",   "command":  "/lambda",   "channel":  "genral",   "command_text":  "ec2  start  i-­‐xxxxxxxx",   "response_url":  "https://...." } 6 2016/4/22 JAWS-UGアーキテクチャ専門支部クラウドネイティブ 分科会CDP議論会#8
  • 8. lambda-bot関数概要 def lambda_handler(event,  context): req_body =  event['body'] params =  parse_qs(req_body) トークンチェック 引数取りだし arg =  command_text.split('  ') if  arg[0]  in  ['ec2',  's3']: sns =  boto3.client('sns') topic_arn =  sns.create_topic(Name='sns-­‐lambda')['TopicArn'] message={"user_name":  user,  "command":  command,  "channel":  channel,  "command_text":  com mand_text,  "response_url":  response_url} message=json.dumps(message) message=json.dumps({'default':  message,  'lambda':  message}) response  =  sns.publish( TopicArn=topic_arn, Subject='/lambda', MessageStructure='json', Message=message ) return  {  "text":  "%s  %s¥nroger"  %  (command,  command_text)  } elif arg[0]  ==  'help': return  {  "text":  "ec2  [console|start|stop instance-­‐id]¥ns3  [usage  bucket]"  } else: return  {  "text":  "%s  invoked  %s  in  %s  with  the  following  text:  %s"  %  (user,  command,  ch annel,  command_text)  } 8 2016/4/22 JAWS-UGアーキテクチャ専門支部クラウドネイティブ 分科会CDP議論会#8
  • 9. notify-to-slack関数概要 def lambda_handler(event,  context): message  =  event['Records'][0]['Sns']['Message'] logger.info("Event:  "  +  str(message)) if  True: message  =  json.loads(message) 引数取りだし arg =  command_text.split('  ') slack_message =  { 'channel':  '@%s'  %  user_name, 'response_type':  'ephemeral', #  or  'in_channel' 'isDelayedResponse':  'true', 'text':  "%s  %s"  %  (command,  command_text) } if  arg[0]  ==  'ec2': slack_message['text']  =  ec2_command(arg,  user_name,  response_url) send_response(response_url,  slack_message) elif arg[0]  ==  's3': slack_message['text']  =  s3_command(arg,  user_name,  response_url) send_response(response_url,  slack_message) else: slack_message =  {  'text':  "command  failed"  } send_response(response_url,  slack_message) 9 2016/4/22 JAWS-UGアーキテクチャ専門支部クラウドネイティブ 分科会CDP議論会#8
  • 10. STSでの権限の引き受け ポリシー名とロール名をハードコードしています。ほかに良い方法があれば… iam =  boto3.client('iam') response  =  iam.get_user(UserName=user_name) if  response.has_key('User'): uid =  response['User']['Arn'].split(':')[4] if  uid and  boto3.resource('iam').UserPolicy(user_name,  'ec2-­‐full-­‐access'): response  =  iam.get_role(RoleName='virginia-­‐ec2-­‐delegate') if  response.has_key('Role'): sts =  boto3.client('sts') assumedRoleObject =  sts.assume_role(RoleArn="arn:aws:iam::%s:role/%s"  %   (uid,  'virginia-­‐ec2-­‐delegate'),  RoleSessionName='session') credentials  =  assumedRoleObject['Credentials'] ec2  =  boto3.resource( 'ec2', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token =  credentials['SessionToken'], ) 10 2016/4/22 JAWS-UGアーキテクチャ専門支部クラウドネイティブ 分科会CDP議論会#8
  • 11. response_urlに応答を返す def send_response(response_url,  message): req =  Request(response_url) req.add_header('Content-­‐Type',  'application/json') try: response  =  urlopen(req,  json.dumps(message)) response.read() except  HTTPError as  e: logger.error("Request  failed:  %d  %s",  e.code,  e.reason) except  URLError as  e: logger.error("Server  connection  failed:  %s",  e.reason) 11 2016/4/22 JAWS-UGアーキテクチャ専門支部クラウドネイティブ 分科会CDP議論会#8
  • 12. 課題 • 認証 – いまのところ、Slackのユーザ名をAWSのユーザ名に対応づけて 扱っています。 – コマンド実行のときは、できればユーザ認証をしたい。 – MFAできればよいけれど… … – Cognitoの新機能「User Pools」を使えばMFAできるの? • STS – ポリシー名とロール名をハードコードしているところ、 ユーザが持っている権限をチェックできた方がよい。 – 実用上はハードコードでもかまわない? 12 2016/4/22 JAWS-UGアーキテクチャ専門支部クラウドネイティブ 分科会CDP議論会#8