SlackからIAMグループの移動を実現する方法
こんにちは、こよいです。
みなさんAWS権限管理はどのようにしてるでしょうか?
権限管理を行わないと、商用環境のリソースを誰でも触れるようになってしまい、思わぬトラブルにつながってしまいます。
そこで、私の所属しているプロジェクトでは、AWSの権限管理は以下のように行なっています。
このような管理方法だと、IAMGroupに所属させるだけのために、AWSへログインする必要があります。
お忙しい管理者にとってめんどくさいですね。管理者はそもそもあまりAWSとかにログインしていないと思います。笑
このような状態を解決すべく、管理者から「もっと簡単に権限管理する方法ない?」と要望を受けました。
そこで、SlackからIAMグループの移動を実現しましたので、ご紹介いたします。
この方法を取り入れることで、SlackにてAWSコマンドを打つことが可能になり、簡単にIAMグループの移動をすることができるようになりました。
イメージ図
AWS Chatbotとは?
AWS Chatbotは、AWSの各種サービスとSlackやMicrosoft Teamsを連携し、操作やモニタリングを簡単にしてくれるサービスです。
これを使うと、SlackからLambdaを操作できるので、AWS内サービスのほとんどを操作できることになります。
AWS Lambdaとは?
AWS LambdaはAWSが提供するサーバレスサービスで、サーバを管理することなく、コードを実行できるサービスです。
実行したい処理が書かれたコードをLambda上にアップロードし、そのLambdaを起動することで、処理を実行できます。
前提
早速ですが、作っていきますが以下の準備ができていることを前提とします。
- Slackアカウントあり(無料アカウントでオーケー)
- Python3.12
- AWSの基本的な知識があること
テスト用のIAMグループを作ってユーザがそのグループに所属させる/外すができたら成功です。
検証用IAMグループの作成
検証用にIAMグループを作ります。
特にこのグループでの操作はないので、ポリシーの付与は不要です。
名前はiam-group-outhとしておきましょう。

Lambda実行ロールの作成
LambdaはIAMグループにユーザを移動する操作を行います。この操作をできるように、まずLambda実行ロールには、作ったiam-group-outhにユーザを追加削除できる権限を追加します。
ロール名
iam-role-lambda-chatops-outh
信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
インラインポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"iam:AddUserToGroup",
"iam:RemoveUserFromGroup"
],
"Resource": "arn:aws:iam::111111111111:group/iam-group-outh"
},
{
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
Lambdaの作成
Lambdaで使うロールができたので、Lambdaを作っていきます。
IAMグループにユーザを加える、外す処理を書いていきます。
関数名
lambda-chatops-auth
コード
UserNameは移動させたいユーザ名を適宜置き換えてください。
import boto3
def lambda_handler(event, context):
iam = boto3.client('iam')
is_grant = event['is_grant']
if is_grant == True: # Use Python's True instead of true
response = iam.add_user_to_group(
GroupName='iam-group-outh',
UserName='<任意ユーザ>',
)
message = "ユーザがグループに追加されました。"
else:
response = iam.remove_user_from_group(
GroupName='iam-group-outh',
UserName='<任意ユーザ>',
)
message = "ユーザがグループから外されました。"
# CloudWatchLogsに出力する
print(message)
# Slackに出力する
return message
Slackチャンネルの作成
Slackの画面に移動し、「チャンネル」→「作成」→「チャンネルを作成する」の順にクリック。

以下のような画面が出現するので、任意のチャンネル名を記載し、次へをクリック。
今回はchatbot-testとします。

可視性は今回はパブリックとし、作成をクリック。
権限管理の観点からプライベートを選んだ方が良い場合もあります。

メンバーすべてを追加するにチェックを入れた状態で、終了をクリック

こんな感じにチャンネルが作成されました!

AWS ChatBotの作成
AWS Chatbot がコマンドを実行できるようにするために、Slack で AWS Chatbot を設定していきます。設定するためには、次のような手順を行います。
ステップ1:Slackクライアントを設定する
AWS Chatbot がコマンドを実行できるようにするために、Slack で AWS Chatbot を設定していきます。
ワークスペースとAWS ChatBotを接続します。
ChatBot画面に行き、チャットクライアントを設定にてチャットクラントにて「Slack」を選び、「クライアントを設定」をクリックします。

Slackの認証画面にて「許可する」をクリック。

Tutorial: Get started with Slack - AWS Chatbot
この時点で、SlackにAWSChatBotアプリが登録されましたので、確認しておきます。
Slackにいき、「アプリを追加する」をクリック。

登録されていれば「AWS Chatbot」が登録されていることがわかります。

ステップ2:Slackチャンネルを設定する
AWS Chatbot が Slack チャンネルでコマンドを実行できるようにするには、Slack チャンネルで AWS Chatbot を設定する必要もあります。チャンネルの設定は、次のとおりです。
- Slack チャンネルに AWS Chatbot を追加する
- チャンネルで利用する、ガードレールポリシーの作成
- 構成にチャネルを関連付けとユーザー権限を定義
-
Slack チャンネルに AWS Chatbot を追加する。
-
Slackチャンネルの作成 手順で作成したSlack チャンネルで、
invite @awsと入力します。 - 「招待」を選択します。

-
Slackチャンネルの作成 手順で作成したSlack チャンネルで、
-
チャンネルで利用する、ガードレールポリシーを作ります。
チャンネルを作る前にガードレールポリシーを作ります。
ChatBotにはLambdaを操作する権限のみをつけます。
ガードレールポリシー
ポリシー名
iam-policy-chatbot-guardrail-chatops-outhポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:ap-northeast-1:111111111111:function:lambda-chatops-auth" } ] } -
構成にチャネルを関連付けとユーザー権限を定義
AWS Chatbot コンソールのワークスペースの詳細ページで、 「**新しいチャネルの設定」**をクリックします。

設定の詳細で、設定名を入れます。
今回は、
chatbot-channel-chatops-outhとします。ログ記録は、チェックを外します。
ログは、Cloud Wtach Logsへ記録されます。ログにはchatbotを利用した、ワークスペースや、チャンネル、ユーザ情報、実施したコマンド情報などが取れますが、今回は料金がかかってしまうので、利用しません。
Slack チャネルでは、手順 1 で使用したチャネルを選択します。
AWS Chatbot はパブリックチャネルとプライベートチャネルの両方をサポートしていますが、今回は、パブリックチャネルを利用します。
パブリックを選択し、パブリックチャネル名にて手順 1 で使用したチャネルを選択します。

アクセス許可のセクションでは、チャンネルユーザのロール、チャンネルガードレールポリシーを設定します。それぞれの用語の定義は以下の通りです。ロールの設定によってチャンネルメンバーに与えられる権限が決まります。用途に応じて、指定してください。
- チャンネルロールは、Slack上のチャンネルに存在するユーザ全員の権限を管理します。
- ユーザロールは、特定のユーザのみの権限を管理します。
- チャンネルガードレールは、チャンネルメンバーが利用できるアクションを制御します。チャンネルガードレールポリシーは、チャンネル上最も優先されるポリシーで、ここで許可されていない操作は、チャンネルロールや、ユーザロールに存在しようと、操作できません。
Understanding AWS Chatbot permissions - AWS Chatbot
今回は、まず実施してみることを目的とするので、チャンネルロールを使いたいと思います。
ロール設定では、「チャネルロール」を選択します。
チャネルロールで、「テンプレートを使用してIAMロールを作成する」を選択します。
ロール名は、
iam-role-chatbot-channel-chatops-outhとします。ポリシーテンプレートは、「Lambda呼び出しコマンドのアクセス許可」を選択します。
このロールは、すべてのLambdaを実行することができる権限になっています。
チャンネルガードレールポリシーは、手順2で作成した「iam-policy-chatbot-guardrail」を選択します。
チャンネルロールでは、すべてのLambdaの実行が可能な状態となっていますが、ガードレールポリシーで権限を絞ることができます。先に設定した通り、ガードレールポリシー「iam-policy-chatbot-guardrail」は、Lambda「lambda-chatops-auth」の実行権限のみ付与されているので、このチャンネルメンバーは、他のLambdaの実行はできないようになっています。

通知のセクションは設定しません。AWS側からSlackに通知するような仕組みを実装する時に利用しますが、今回は不要です。
タグのセクションの設定は、任意でお願いします。
最後まで設定が完了したら「設定」をクリックして設定完了です!

実験
設定が完了したので、実験していきましょう!
Slackチャンネル「chatbot-test」にてコマンドを打っていきます。
※あらかじめ、IAMグループ「iam-group-outh」にユーザがいないことを確認しておいてください。
Slackにいき、chatbot-testチャンネルを開き、以下コマンドを実施します。
@aws lambda invoke
--function-name lambda-chatops-auth
--payload '{ "is_grant": true }'
--region ap-northeast-1
以下のように返信が来るので、1件の返信をクリックし、スレッドを開きます。

スレッドには、以下のような返信が来ているので、「[Run] command」をクリックします。

以下のように返信されれば成功です!

実際にIAMグループ「iam-group-outh」を確認します。
うまく登録されていました。成功ですね。

グループから外したいときは、{ "is_grant": false }としてあげれば外すことができます。
@aws lambda invoke
--function-name lambda-chatops-auth
--payload '{ "is_grant": false }'
--region ap-northeast-1
以上で完了です。
まとめ
今回は、Slackから直接AWSのIAMグループ管理を行う方法を紹介しました。これで、わざわざAWSにログインしなくても、チャットでサッと権限管理ができるようになります。時間も節約できて、業務効率もアップ間違いなし!ぜひ試してみて、権限管理をもっとラクにしちゃいましょう!
Discussion