AWS ChatbotとSlackのWorkflowを使ってSlackから特定のインスタンスに特定のコマンドを実行させる
re:Invent関連で何か書くとはいうものの、re:Inventでのアップデート周りはだいたいクラスメソッドさんのDevelopers IOで書かれてしまうので、被らないネタを探すのが難しいですね。
このネタも実はかぶっているのですが、せっかくやっとSlackのほうからコマンドを送れるようになったので、それを使ってサーバ上でコマンドを走らせてみよう、というのが今回の記事です。
今まではChatbotと言いながらも、Slackの側から何かをさせることはできませんでしたからね。
厳密にはLambda Functionを経由して何かをさせることはできなくもありませんでしたが、いちいちLambda Functionを作るのは面倒でした。
それがようやく簡単にできるようになったかという思いでした。
やること
大まかに下記のことをやります。
- AWS ChatbotからSlackのチャンネルに通知が送れるようにする
この部分はこれまでもできたことですね。
まず、AWS Chatbotを使ってSlackに通知が送れる状態にします。
設定方法は下記の記事が詳しいです。
AWS再入門ブログリレー AWS Chatbot編 - Slackからaws cliを実行できるようにする
今回のアップデートによってできるようになったことです。こちらは先にも挙げたこの記事が詳しいです。
[プレビュー]AWS ChatbotがSlackでのAWSリソース管理に対応しました! #reinvent
なお、制限がありすべてのコマンドが実行可能なわけではありません。
ここではEC2インスタンスへコマンドを送ることのみをできるようにしたいので、権限をssmからコマンドを呼び出すことを行うことだけができる範囲に絞ります。 - Slackでワークフローを作り、特定のコマンドを呼び出せるようにする
一応、今回新規性のある部分です。
こちらで実際にコマンドを実行してみます。
以後は上記の1,2が完了している前提で記載します。
Slackからコマンドが実行できる権限を設定する
aws cliを実行できるようにする手順の中で、Slackチャンネル側からどのコマンドを実行できるようにするかを、Chatbot側のガードレールとIAMロールの双方で指定する箇所があります。
本当はssmのsend-commandでやるつもりだったんですが、何度試してもSlackからのsend-commandがエラーになってしまったので、今回はAutomationによって実行することにしました。
その場合に必要な権限はおおよそ下記のとおりです。
※下記はIAMロールの権限のため、StartAutomationExecutionの権限を特定のAutomationのarnに絞っています。
これとは別にガードレールに権限を設定する必要がありますが、ガードレールの権限はこれよりも広い必要があります。
Slackチャンネルに与えたいMaxの権限をガードレール側では設定し、個別のIAMロールではガードレールの権限の範囲内で権限を設定します。
試すだけならガードレールとまったく同じ設定にしていてもOKです。
ここではとりあえずワイルドカードで指定しておいて、のちほどAutomationDocumentを作成したあとにarnを確認してから入力してももちろんOKです。
今回は特定のインスタンスのみを対象にRunShellScriptを実行させたいのでSendCommandの権限もそうしていますが、
権限が足りなかったりする場合はコンソールからエラー内容を確認して適切に権限を振ってください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ssm:StartAutomationExecution",
"Resource": "arn:aws:ssm:ap-northeast-1:xxxxxxxxxxxxx:automation-definition/HogeAutomation:*"
},
{
"Effect": "Allow",
"Action": [
"ssm:ListCommands",
"ssm:DescribeInstanceInformation",
"ssm:ListCommandInvocations"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "ssm:SendCommand",
"Resource": [
"arn:aws:ssm:*:*:document/AWS-RunShellScript",
"arn:aws:ec2:ap-northeast-1:xxxxxxxxxxxx:instance/i-xxxxxxxxxxxxxx"
]
}
]
}
SSM Automationドキュメントを作成する
Automationを実行するためにその内容を定義しましょう。
Systems Managerのコンソールから「ドキュメント」を選択し、Create documentからAutomationを選択します。
このとき、実行したいリージョンになっていることを確認しましょう。
SSM Documentの編集は以前は面倒そのものでしたが、今はだいぶ楽になっています。
ただ、今回はやることが決まっているのでエディタから下記を入力します。
schemaVersion: '0.3'
mainSteps:
- name: CommandFromSlack
action: 'aws:runCommand'
inputs:
InstanceIds:
- i-xxxxxxxxxxxxxx
DocumentName: AWS-RunShellScript
Parameters:
commands: echo "Hello,World!"
名前の欄はChatbotのロールやポリシーで個別にドキュメントを指定するならそちらと名前が一致する必要があります。
今回は特定のインスタンスIDに対してRunShellScriptでecho "Hello,World!"
とコマンド実行させるだけのAutomationです。
Slackでワークフローを作成する
あとはSlackでワークフローを作るだけです。
Chatbotを連携させたチャンネルでワークフローを作ります。
多分PCからやる必要があったはずです。
Slackの入力欄の左に雷のようなマークがあるのでそちらを押すと、選択肢にワークフロービルダーがあるのでそちらを選択します。
を押してを押す。
その後画面に従って作成していきます。
名前は任意です。
今回はショートカットからの起動を選択します。
次にこれはワークフローを起動するショートカットを追加するチャンネルを選ぶところなのでどこを選んでもかまいません。
次にワークフローステップの追加で「メッセージの送信」を選択します。
その次にはメッセージの送信内容を定義します。
メッセージの送信先は、AWS Chatbotと連携したチャンネルにしてください。
テキストにはaws cliのコマンドを@aws
に対してメンションで送ります。
このとき、正しく@aws
へのメンションになっていることを確認してください。
ここではcliでstart-automation-executionを実行しています。
ドキュメント名は自分で作成したドキュメントの名前にしてください。
リージョンはドキュメントを作成したリージョンを明示的に指定しましょう。
@aws ssm start-automation-execution --document-name HogeAutomation --region ap-northeast-1
ここまで完了したら、「公開する」を押してワークフローを公開します。
このワークフローが同じ組織の中に公開されます。
ワークフローを作成したチャンネルで先程の雷のボタンを押すと、作成したワークフローがあるはずです。
試しに実行してみましょう。
うまく行けばAutomationが実行され、Automationの実行ログをコンソールで確認するとHello,World!が出力されているはずです。
よかったこと
- エンジニアがサーバに入って特定のコマンドを実行しなければいけないケースでも、非エンジニアの方に実行してもらうことが可能になった
Webサーバの再起動など…。もちろん、いたほうがよいですが影響が少ないと言い切れるような場合の話です。
その他
AWS側もドキュメントにおいてよくあるユースケースをまとめてくれていますのでぜひ参考にしてみてください。
Using CLI commands with AWS Chatbot - Common use cases
実は今回やっていることはRun an Automation runbookと大して変わりません。
運用にうまく活用していきたいですね。
Discussion