TerraformでAWS Chatbotを作成する
TerraformでAWS Chatbotを作成したいけれど、Terraform Registryを見てもそれらしきresource typeが無いとお嘆きの方へ。以下のmoduleを利用することで作成できます。
サンプルコード
module "chatbot_slack_configuration_sample" {
source = "waveaccounting/chatbot-slack-configuration/aws"
version = "1.1.0"
configuration_name = "config-name"
guardrail_policies = ["arn:aws:iam::aws:policy/ReadOnlyAccess"] # 任意だが明示的に指定することを推奨。理由は後述。
iam_role_arn = aws_iam_role.chatbot.arn
logging_level = "ERROR" # 任意
slack_channel_id = aws_ssm_parameter.slack_channel_id.value
slack_workspace_id = aws_ssm_parameter.slack_workspace_id.value
sns_topic_arns = [aws_sns_topic.sample.arn]
user_role_required = false # 任意
# 任意
tags = {
Name = "sample"
}
}
なぜ作成できるのか
Terraform Provider for AWSは現時点でAWS Chatbotに対応していません。
これは、AWS SDK for GoがChatbotに対応していないためです。
しかし、CloudFormationでChatbotを作成することはできます。
TerraformはCloudFormationを扱うことができますが、これを利用してTerraformでのAWS Chatbot作成を実現しています。冒頭紹介したmoduleは、内部にCloudFormationテンプレートを持っていて、これを実行してChatbotを作成しています。
手動で作成済みのChatbotをTerraform管理下に置きたい場合
以下の手順でTerraform管理できます。
1. まずCloudFormationスタックとしてインポートする
- CloudFormationの画面で
スタックの作成
>既存のリソースを使用
を選択 - 以下のCloudFormationテンプレートをアップロード
- インポートしたいChatbotのARNを入力
- arn:aws:chatbot::{aws_account_id}:chat-configuration/slack-channel/{config-name}
- スタックの名前を入力の上、各パラメータを既存のChatbotと同じ内容で入力
2. 続いてTerraformとしてimportする
terraform import module.{module_name}.aws_cloudformation_stack.chatbot_slack_configuration {CloudFormation stack name}
その他利用する上での補足
1. guardrail_policiesに設定できるpolicyは1つだけ
Chatbotでは、Chatbotそのものに紐づけたチャネルロールや、ユーザーロールの権限に基づいて処理を行うことができます。
guardrail_policies
は上記ロールより優先されます。guardrail_policies
にReadOnlyAccessを設定しておけば、例えチャネルロールやユーザーロールがAdministratorAccessを持っていたとしても読み取り系の操作しかできない、といったガードレールの役割を果たします。
注意点としてpolicies
という名前であることから複数のpolicyを設定できそうですが、設定しようとするとCloudFormationのAPIがエラーを返します。
Resource handler returned message: "Invalid request provided: Invalid request body (Service: AWSChatbot; Status Code: 400; Error Code: InvalidRequestException; Request ID: xxx; Proxy: null)" (RequestToken: xxx, HandlerErrorCode: InvalidRequest)
AWSのサポートに問い合わせたところ、現在はまだ1つしか設定できず、将来的には複数の設定に対応する予定だそうです。私からの問い合わせの結果、ドキュメントには、1つしか設定できない旨を追記してくれました。
Currently, only 1 IAM policy is supported.
なお、将来的な対応を見越して、guardrail_policies
のtypeはlist(string)となっています。
variable "guardrail_policies" {
type = list(string)
//
}
2. guardrail_policiesのデフォルト値はAdministratorAccess
CloudFormationとしてのGuardrailPolicies
プロパティの設定は任意であり、プロパティの記述を省略した場合に作成されるChatbotのGuardrail policiesはAdministratorAccessとなります。
The list of IAM policy ARNs that are applied as channel guardrails. The AWS managed 'AdministratorAccess' policy is applied as a default if this is not set. Currently, only 1 IAM policy is supported.
Required: No
本記事で紹介しているTerraform moduleも上記の仕様に沿って、guardrail_policies
を省略した場合は同様にAdministratorAccessが設定されるようになっています。
variable "guardrail_policies" {
//
default = ["arn:aws:iam::aws:policy/AdministratorAccess"]
//
}
ちなみに、Guardrail policiesは2021年11月にChatbotに追加された概念ですが、それ以前に作成済みの既存ChatbotのGuardrail policiesにはReadOnlyAccessが自動的に設定されたそうです(伝聞なので事実は未確認)。
よって、手動で作成済みで、かつGuardrail policiesがReadOnlyAccessのChatbotを、本記事で紹介したTerraform moduleにimportした場合、moduleの変数guardrail_policies
を未定義としていると次回のterraform apply
時にGuardrail policiesがAdministratorAccessに置き換わります。
通常のTerraform運用であればapplyの前にplanをして確認するでしょうから知らない間に置き換わってしまったということはないと思いますが、ご注意ください。
3. サブスクリプションは自動で作成される
Chatbotでは作成時にsubscribeするSNSトピックを指定しますが、その結果サブスクリプションが自動で作成されます。
そのため、本記事のmoduleを使う場合、Terraformでaws_sns_topic_subscription
を作成する必要はありません。
4. その他の当moduleの仕様
他のTerraform moduleと同様、ドキュメントが公開されていますので本記事で取り扱っていない仕様に関してはそちらを参照ください。
余談
このmoduleは以前から公開されていたのですが、前述の2021年11月のChatbotの機能追加への対応はされていませんでした。
そこで、今回私の方からPRを出して、無事マージしてもらいました。ということで私もcontributorの1人となっています(これを言いたかった!)。
ぜひ使ってみてください!
参考
Discussion
取り急ぎの共有です。
waveaccounting/terraform-aws-chatbot-slack-configuration module ですが、2024/8/24 時点で消失されていることを確認しました。。
作成されたリソースがあるなら import 駆使等でどうにかなりますが・・・
共有ありがとうございます!
削除までせずアーカイブするぐらいに留めてくれればいいのに...😢
ほんとそう・・・どうして削除しちゃったんでしょう・・・ 😭
耳寄り情報を見つけたのでコメントに入れておきます