Terraformを利用してAmazon Connectインスタンスとセキュリティプロファイルを作成してみる

コンサルティング部の洲崎です!TerraformでAmazon Connectインスタンスとセキュリティプロファイルを作成してみました。
2022.06.05

Terraformを勉強し始めました。
Amazon ConnectをTerraformで構築する方法について気になったので、Amazon ConnectインスタンスとセキュリティプロファイルをTerraformで作成してみます。

利用環境

  • Terraform v1.2.2
  • macOS Big Sur v11.6.6

注意点

TerraformのドキュメントにAmazon Connectインスタンスの作成・削除について30日で100回と制限が設けられていると記載がありました。
やりすぎないように注意しましょう。
(ドキュメントより抜粋)

Amazon Connect enforces a limit of 100 combined instance creation and deletions every 30 days. For example, if you create 80 instances and delete 20 of them, you must wait 30 days to create or delete another instance. Use care when creating or deleting instances.

やってみる

Terraformのインストールはこちらをご参照ください。
(Macであればbrewでインストール可能です)
今回のディレクトリ構成は下記です。

sample/
 ├ main.tf
 ├ config.tf
 ├ connect_instance.tf
 ├ output.tf
 └ security_profile.tf

Amazon Connectインスタンスを作成し、インスタンスIDをOutputで出力します。
出力したインスタンスIDを元に、作成したAmazon Connectインスタンスに対してセキュリティプロファイルを作成します。
今回はシンプルに一つのtfstateファイルを参照する形で実装しています。
terraform_remote_stateというやり方でもtfstateファイルを参照する方法もありますので、そちらを利用する場合は下記をご参照ください。

【Terraform】terraform_remote_stateデータソースの使い方

terraform_remote_stateをまとめてみた

main.tf

main.tfの中身はシンプルです。
プロバイダー(AWS)の指定と、モジュールの指定を行っています。

main.tf

provider "aws" {
  region = "ap-northeast-1"
}

module "connect_instance"{
  source = "../"
}

module "security_profile"{
  source = "../"

config.tf

事前にS3バケットを作成し指定することで、tfstateファイルをS3で管理します。

config.tf

terraform {
  backend "s3" {
    bucket = "${作成したバケットの名前}"
    key    = "state"
    region = "ap-northeast-1"
    acl    = "bucket-owner-full-control"
  }
}

connect_instance.tf

メインとなるAmazon Connectインスタンス作成のモジュールです。
ドキュメントを参考に記述します。
今回はAmazon Connectでユーザー作成/管理するインスタンスで作成します。

connect_instance.tf

resource "aws_connect_instance" "test1" {
  identity_management_type = "CONNECT_MANAGED"
  inbound_calls_enabled    = true
  instance_alias           = "${インスタンス名}"
  outbound_calls_enabled   = true
}

output.tf

connect_instance.tfで作成したインスタンスIDを出力させるモジュールです。
outputの後ろの"instance_id"は任意の文字でOKです。
valueで作成したAmazon Connectインスタンスを指定します。
(個人的にこの指定の仕方が慣れておらずだいぶ時間を溶かしました..)

output.tf

output "instance_id" {
   value = aws_connect_instance.test1.id
}

security_profile.tf

output.tfで出力したインスタンスIDを指定しつつ、セキュリティプロファイルを作成するモジュールです。
こちらもドキュメントを参照しつつ作成します。

security_profile.tf

resource "aws_connect_security_profile" "example" {
  instance_id = aws_connect_instance.test1.id
  name        = "example"
  description = "example description"

  permissions = [
    "BasicAgentAccess",
    "OutboundCallAccess",
  ]

  tags = {
    "Name" = "Example Security Profile"
  }
}

これでモジュールの作成は完了です。

Terraformの実行

それではTerraformを実行してみます。
まずはterraform initコマンドを叩き、terraform実行の準備をします。
下記表示がでたら完了です。

Terraform has been successfully initialized!

次にterraform planコマンドを叩きます。
結果として2つのリソースを作成する予定と表示されます。
1つはAmazon Connectインスタンス(今回はtest1という名前)の作成、2つ目はセキュリティプロファイルの作成です。
arnやインスタンスIDは作成されてから分かるパラメーターなのでknown after applyと表示されます。

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_connect_instance.test1 will be created
  + resource "aws_connect_instance" "test1" {
      + arn                              = (known after apply)
      + auto_resolve_best_voices_enabled = true
      + contact_flow_logs_enabled        = false
      + contact_lens_enabled             = true
      + created_time                     = (known after apply)
      + early_media_enabled              = true
      + id                               = (known after apply)
      + identity_management_type         = "CONNECT_MANAGED"
      + inbound_calls_enabled            = true
      + instance_alias                   = "${インスタンス名}"
      + outbound_calls_enabled           = true
      + service_role                     = (known after apply)
      + status                           = (known after apply)
    }

  # aws_connect_security_profile.example will be created
  + resource "aws_connect_security_profile" "example" {
      + arn                      = (known after apply)
      + description              = "example description"
      + id                       = (known after apply)
      + instance_id              = (known after apply)
      + name                     = "example"
      + organization_resource_id = (known after apply)
      + permissions              = [
          + "BasicAgentAccess",
          + "OutboundCallAccess",
        ]
      + security_profile_id      = (known after apply)
      + tags                     = {
          + "Name" = "Example Security Profile"
        }
      + tags_all                 = (known after apply)
    }

Plan: 2 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + instance_id = (known after apply)

実行する内容は問題ないですね。
terraform applyコマンドを叩いてデプロイします。
改めて作成される内容と、Do you want to perform these actions?と聞かれるので、yesと答えます。
少し待つと、およそ2分ほどでAmazon Connectインスタンスとセキュリティプロファイルが作成されました!

aws_connect_instance.test1: Creating...
```
aws_connect_instance.test1: Creation complete after 2m9s [id=xxxxxxxxxxxxxx]
aws_connect_security_profile.example: Creating...
aws_connect_security_profile.example: Creation complete after 1s [id=xxxxxxxxxxxxxx]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Outputs:

instance_id = "xxxxxxxxxxxxxx"

結果を見るとAmazon Connectインスタンスを作成してから、インスタンスIDを参照してセキュリティプロファイルを作成していることがわかります。
また、Outputsの出力としてインスタンスIDが問題なく出力されています。
AWSマネジメントコンソールを見ると、ちゃんとインスタンスが作成されており、Amazon Connectコンソールに入るとセキュリティプロファイルが作成されていました!
作成したAmazon Connectインスタンス

作成したセキュリティプロファイル

今回検証したかったことはできたので、あとはterraform destroyでリソースを削除します。
お疲れ様でした。

(補足)Amazon Connect×Terraformについて

今回Amazon ConnectをTerraformで構築すると考えた時に、どこまでIaC化するかも考えました。
Terraformが現在対応しているAmazon Connectリソースは下記です。(2022/6/5現在)

  • aws_connect_bot_association
  • aws_connect_contact_flow
  • aws_connect_contact_flow_module
  • aws_connect_hours_of_operation
  • aws_connect_instance
  • aws_connect_lambda_function_association
  • aws_connect_queue
  • aws_connect_quick_connect
  • aws_connect_routing_profile
  • aws_connect_security_profile
  • aws_connect_user_hierarchy_group
  • aws_connect_user_hierarchy_structure

セキュリティプロファイルのほかにキュー(queue)やオペレーション時間(hours_of_operation)はセキュリティプロファイルのやり方と同様、インスタンスIDを持ってくればIaC化は簡単にできそうです。
一方、コンタクトフローは、AWS CLIで既存のコンタクトフローに対してdescribe-contact-flowを叩いて中身をみないと中々コツが入りそうなのと、Amazon Connectのユーザー作成についてTerraformは現在未対応でした。
その為、コンタクトフローとAmazon Connectユーザーについては下記運用が良さそうだなと感じました。
コンタクトフロー
Amazon Connectコンソールでインポート/エクスポート(ベータ版)を利用する
問い合わせフローのインポート/エクスポート
Amazon Connectユーザー
Amazon Connectコンソールでcsvインポートが利用する
Amazon Connect にユーザーを追加する

感想

TerraformでAmazon Connectインスタンスとセキュリティプロファイルを構築してみました。
Terraformを今まで触ったことなかったので、Amazon Connectというよりoutputsやリソース指定でハマりました。。
ただ、Amazon Connectは日々触っていたのでイメージしながらTerraformを学べたのが良かったです。

ではまた!コンサルティング部の洲崎でした。

参考

Resource: aws_connect_instance
Resource: aws_connect_security_profile
Output Values