[プレビュー]AWS ChatbotがSlackでのAWSリソース管理に対応しました! #reinvent

AWS Chatbotに新機能追加!SlackからLambda不要でAWSリソースを管理できるようになったぞ!(プレビュー) AWS Chatbot始まったな。
2021.11.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、おんづか(@onzuka_muscle)です!

Keynote前にどこどこアップデートが出始めましたね。

※本記事で取り扱っている機能はパブリックプレビューになります。(2021/11/29時点)

Today, we are announcing the public preview of a new feature that allows you to use AWS Chatbot to manage AWS resources and remediate issues in AWS workloads by running AWS CLI commands from Slack channels. Previously, you could only monitor AWS resources and retrieve diagnostic information using AWS Chatbot.

AWS Chatbotを使ってAWSリソースを管理したり、SlackチャンネルからAWS CLIコマンドを実行してAWSワークロードの問題を修復したりすることができる新機能」とのこと。

これまでも参照系の操作(ListやDescribe等)はSlackから実行可能だったのですが、今回のアップデートによってCreateやDelete等の変更系の操作も対応したようです!

With this feature, customers can manage AWS resources directly from their Slack channels. Customers can securely run AWS CLI commands to scale EC2 instances, run AWS Systems Manager runbooks, and change AWS Lambda concurrency limits.

例として「AWS CLIコマンドを実行して、EC2インスタンスのスケール、AWS Systems Manager runbooks実行、AWS Lambdaの同時実行制限の変更」が挙げられています。

早速、試してみます!

やってみた

今回はSlackからEC2を(起動)・停止してみます。

ChatbotとSlackワークスペースの連携

ここは割愛させてもらいます。

こちらをご参考ください。

チャンネルの設定

ここでアクセス権限の設定をします。

  • ロール設定
    • 今回はサクッと試すためにチャネルIAMロールを選択します。
    • (ユーザーロールを選択するとユーザーごとに個別にIAMロールを選択する必要があります。)
  • ガードレール設定
    • ロールが持つ権限より優先されます。

Slackでコマンドを実行してみる

パターン①チャネルIAMロール、ガードレールのどちらでもアクションを許可する

ガードレール

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*"
        }
    ]
}

チャネルIAMロールにアタッチしているIAMポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:instance/i-0702ee3980a4c0d74"
        }
    ]
}

Slackでコマンドを実行しました。

メッセージを送信すると「このコマンドを」「このアカウントで」「このロールが」「このリージョンで」「実行しようとしてるけどどうする?」と事前に確認してくれます。

「[Run] command」「[Cancel] command」に加えて「[Add] optional parameters」というのも選択肢にありました。

試しに「[Add] optional parameters」」を押してみました。

optional parameterについて教えてくれました。これは便利そう!

このまま「Run」を実行してみます。

成功したようなメッセージがでました。

停止中になってます!成功ですね。

パターン②ガードレールで許可していないアクションを実行しようとする

ガードレール

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"
        }
    ]
}

チャネルIAMロールにアタッチしているIAMポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:instance/i-0702ee3980a4c0d74"
        }
    ]
}

あえてガードレールではDescribeInstancesだけを許可している状態で後は同様の設定・操作をしてみました。

「Run」を実行すると

権限エラーがでて失敗しました。

意図通り、ガードレールによる制御ができています。

補足

Slackからの実行をサポートされていない操作

下記のような操作はAWS Chatbotからの実行をサポートしていません。

Chatbot , IAM が操作できないのは納得ですね。

サポートしていない操作一覧(2021/11/29時点)
  • Chatbot
    • All Operations
  • Amazon Cognito user pools
    • All Operations
  • IAM
    • All Operations
  • AWS Key Management Service
    • All Operations
  • Amazon SimpleDB
    • All Operations
  • Secrets Manager
    • All Operations
  • AWS Single Sign-On
    • All Operations
  • AWS Security Token Service
    • All Operations
  • AWS AppSync
    • ListApiKeys
  • AWS CodeCommit
    • GetFile
    • GetCommit
    • GetDifferences
  • Amazon Connect
    • GetFederationToken
  • Amazon DynamoDB
    • BatchGetItem
    • GetItem
  • Amazon EC2
    • GetPasswordData
  • Amazon ECR
    • GetAuthorizationToken
    • GetLogin
  • GameLift
    • RequestUploadCredentials
    • GetInstanceAccess
  • Lightsail
    • DownloadDefaultKeyPair
    • GetInstanceAccessDetail
    • GetKeyPair
    • GetKeyPairs
  • Amazon Redshift
    • GetClusterCredentials
  • StorageGateway
    • DescribeChapCredentials
  • Amazon S3
    • GetObject
    • HeadObject
  • Snowball
    • GetJobUnlockCode

所感

これまではSlackからAWSリソースの管理をしたいときにLambdaを挟んだ下記のような構成が必要だったのがこちらの機能で"Lambdaなし"で実行可能になりました!

また公式ドキュメントには下記のようなユースケースが書いてありました。

  • EC2インスタンスを再起動する
  • Auto Scalingの制限を変更する
  • Systems ManagerのAutomation runbookを実行する
  • Lambda関数を使ってAWS CodePipelineのアクションを承認する

運用としてよく行う操作をSlackから実行できるようにしておくと捗りそうです。

(定型化した危険の少ない作業には向いてるけどそれ以外の場合はIAMロールでログインしてから操作した方がいいかも?)

また取り扱いに注意が必要な機能だと思いました。

権限設定を誤ってしまうとチャンネル参加メンバー全員がどのEC2でもterminate-instancesできてしまうなんて構成も可能です。(怖)

ガードレールで実行可能なアクションを個別に指定しておき、IAMロールではリソース単位でアクション許可をするような運用が良いのではないかなぁと触りながら想像していました。

今はプレビューなので実運用を検討される方はぜひ今のうちに検証しておきましょう!