🙌

TerraformでAWS Chatbotを作成する

2022/01/08に公開

TerraformでAWS Chatbotを作成したいけれど、Terraform Registryを見てもそれらしきresource typeが無いとお嘆きの方へ。以下のmoduleを利用することで作成できます。

https://github.com/waveaccounting/terraform-aws-chatbot-slack-configuration

サンプルコード

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に対応していません。

https://github.com/hashicorp/terraform-provider-aws/issues/12304

これは、AWS SDK for GoがChatbotに対応していないためです。

https://github.com/aws/aws-sdk-go/issues/3582

しかし、CloudFormationでChatbotを作成することはできます。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html

TerraformはCloudFormationを扱うことができますが、これを利用してTerraformでのAWS Chatbot作成を実現しています。冒頭紹介したmoduleは、内部にCloudFormationテンプレートを持っていて、これを実行してChatbotを作成しています。

手動で作成済みのChatbotをTerraform管理下に置きたい場合

以下の手順でTerraform管理できます。

1. まずCloudFormationスタックとしてインポートする

  1. CloudFormationの画面でスタックの作成 > 既存のリソースを使用を選択
  2. 以下のCloudFormationテンプレートをアップロード
  3. インポートしたいChatbotのARNを入力
    • arn:aws:chatbot::{aws_account_id}:chat-configuration/slack-channel/{config-name}
  4. スタックの名前を入力の上、各パラメータを既存の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.

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-guardrailpolicies

なお、将来的な対応を見越して、guardrail_policiesのtypeはlist(string)となっています。

variables.tf
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

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-guardrailpolicies

本記事で紹介しているTerraform moduleも上記の仕様に沿って、guardrail_policiesを省略した場合は同様にAdministratorAccessが設定されるようになっています。

variables.tf
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と同様、ドキュメントが公開されていますので本記事で取り扱っていない仕様に関してはそちらを参照ください。

https://registry.terraform.io/modules/waveaccounting/chatbot-slack-configuration/aws/latest

余談

このmoduleは以前から公開されていたのですが、前述の2021年11月のChatbotの機能追加への対応はされていませんでした。

そこで、今回私の方からPRを出して、無事マージしてもらいました。ということで私もcontributorの1人となっています(これを言いたかった!)。

contributors

ぜひ使ってみてください!

参考

https://dev.classmethod.jp/articles/aws-chatbot-supports-managing-aws-resources-in-slack/

スマートラウンド テックブログ

Discussion