こんにちは。AWS CLIが好きな福島です。
はじめに
今回は、AWS Chatbotを使い、SlackからSSM経由でEC2上のコマンドを実行する方法をブログに記載いたします。
概要図

前提
今回ご紹介する方法は、SSMの機能を使っているため、対象のEC2がSSMのマネージドインスタンスとして認識されている必要があります。 まだの方は、以下を参考にセットアップしてください。
流れ
- ①IAMポリシーの作成
- ②IAMロールの作成
- ③AWS ChatbotとSlackの連携
- ④SSMドキュメントの作成
- ⑤動作確認
①IAMポリシーの作成
①-①ChatbotがSSMのドキュメントを実行できるようIAMポリシーを作成します。
[AWSアカウントID],[ドキュメント名],[インスタンスID]の3つを適切な値に置き換えます。
- IAMポリシーの設定例
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ssm:SendCommand"
],
"Resource": [
"arn:aws:ssm:ap-northeast-1:[AWSアカウントID]:document/[ドキュメント名]",
"arn:aws:ec2:ap-northeast-1:[AWSアカウントID]:instance/[インスタンスID]"
],
"Effect": "Allow"
}
]
}
②IAMロールの作成
②-① IAMロールを作成し、①で作成したIAMポリシーをアタッチし、信頼関係には以下を設定します。
- 信頼関係の設定
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "chatbot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
③AWS ChatbotとSlackの連携
AWS ChatbotとSlackの連携を行います。
③-①AWS Chatbotのコンソールを開きます。
https://us-east-2.console.aws.amazon.com/chatbot/home?region=us-east-2#/chat-clients
③-②新しいクライアントを設定を押下します。

③-③Slackを選択し、設定を押下します。

③-④許可するを押下します。

③-⑤新しいチャンネルを設定を押下します。

③-⑥設定名とSlackのチャンネルIDを入力します。

- 補足
チャンネルIDはSlackのURLや各チャンネルのチャンネル情報の最下部で確認できます。
③-⑦既存のIAMロールを使用するを選択し、既存のロールに②で作成したIAMロール、チャンネルガードレールポリシーに①で作成したIAMポリシーを設定します。

- 補足
実際にChatbotに付与される権限は、既存のロールに指定したIAMロール(に設定されているIAMポリシー)の権限になります。
ガードレールポリシーはChatbotが持てる権限の範囲になります。そのため、ガードレールに設定したポリシー以上にChatbotは権限を持つことはできません。
③-⑧通知は特に設定せずに、設定を押下します。

④SSMドキュメントの作成
④-①SSMドキュメントのコンソールを開きます。
https://us-east-2.console.aws.amazon.com/systems-manager/documents?region=us-east-2
④-②Create documentからCommand or Sessionを押下します。

④-③任意の名前を付け、ターゲットタイプは「/AWS::EC2::Instance」、ドキュメントタイプは「コマンドドキュメント」を設定します。

④-④JSONを設定し、ドキュメントを作成を押下します。

- Documentの設定例(Linuxの場合(Actionがaws:runShellScript)))
/home/ec2-user/test.shの箇所は、実行したいコマンドに置き換えます。
parametersのdefault値は削除することで引数の指定を必須にすることも可能です。
{
"schemaVersion": "2.2",
"description": "Command Document Example JSON Template",
"parameters": {
"FirstArg": {
"type": "String",
"description": "First argument of the script",
"default": "hoge"
},
"SecondArg": {
"type": "String",
"description": "Second argument of the script",
"default": "hoge"
}
},
"mainSteps": [
{
"action": "aws:runShellScript",
"name": "example",
"inputs": {
"runCommand": [
"/home/ec2-user/test.sh {{FirstArg}} {{SecondArg}}"
]
}
}
]
}
- Documentの設定例(Windowsの場合(Actionがaws:runPowerShellScript))
C:\Users\Administrator\Desktop\test.batの箇所は、実行したいコマンドに置き換えます。
フルパスを指定する場合、\をエスケープする必要があります。
また、parametersの値は不要であれば削除可能で、引数が複数欲しい場合、追加可能です。
{
"schemaVersion": "2.2",
"description": "Command Document Example JSON Template",
"parameters": {
"FirstArg": {
"type": "String",
"description": "First argument of the script"
}
},
"mainSteps": [
{
"action": "aws:runPowerShellScript",
"name": "example",
"inputs": {
"runCommand": [
"C:\\Users\\Administrator\\Desktop\\test.bat {{FirstArg}}"
]
}
}
]
}
⑤動作確認
Slackから実際にコマンドを実行してみます。
⑤-①Slack上でコマンドを実行します。

- コマンド
@aws ssm send-command --targets Key=InstanceIds,Values=[インスタンスID] --document-name [ドキュメント名] --parameters [パラメーターKey1]=[パラメーターValue1],[パラメーターKey2]=[パラメーターValue2] --region ap-northeast-1
- 実行例
@aws ssm send-command --targets Key=InstanceIds,Values=i-0808672558492fde8 --document-name linux-document --parameters FirstArg=1,SecoundArg=2 --region ap-northeast-1
⑤-②[Run] Commandを押下します。
⑤-①を実行すると確認が入るため、問題なければ[Run] Commandを押下します。

⑤-③コマンドが正常に実行されると以下のような出力になります。

補足(SSMのコンソールからも確認してみます。)
以下にアクセスし、対象のコマンドIDを押下します。
https://ap-northeast-1.console.aws.amazon.com/systems-manager/run-command/complete-commands?region=ap-northeast-1
対象のインスタンスIDにチェックをつけ、出力の表示を押下します。

Outputsの箇所でコマンドの実行結果が確認できます。

ちなみに今回実行した/home/ec2-user/test.shは以下の通り、指定された第1,第2引数を出力するスクリプトなため、1 2と表示されています。
[ec2-user@ip-10-88-0-59 ~]$ cat test.sh echo $1 $2 [ec2-user@ip-10-88-0-59 ~]$
終わりに
今回は、SlackからSSM経由でEC2上のコマンドを実行する方法についてブログに記載いたしました。
どなたかのお役に立てれば幸いです。