【AWS Chatbot】SlackからSSM経由でEC2上のコマンドを実行する方法について

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

今回は、AWS Chatbotを使い、SlackからSSM経由でEC2上のコマンドを実行する方法をブログに記載いたします。

概要図

前提

今回ご紹介する方法は、SSMの機能を使っているため、対象のEC2がSSMのマネージドインスタンスとして認識されている必要があります。 まだの方は、以下を参考にセットアップしてください。

docs.aws.amazon.com

流れ

  • ①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上のコマンドを実行する方法についてブログに記載いたしました。

どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

SRE3課

2019/10 入社

AWS CLIが好きです。