こんにちは。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上のコマンドを実行する方法についてブログに記載いたしました。
どなたかのお役に立てれば幸いです。