
こんにちは、SREチームの森原(@daichi_morihara)です。
今回はAmazon ConnectのIaC化および開発体験向上に関する取り組みを共有していきたいと思います。Amazon ConnectはGUIのドラッグ&ドロップによる手作業で簡単にリソースを作成・変更できる利便性が特徴的です。その一方で本番環境でのリソース変更を手作業で行うのはオペミスのリスクが伴うため避けたいものです。
しかし通常リソースのようにAmazon Connectを完全にIaCで管理するのも、必ずしも適切ではありません。なぜならAmazon Connectの長所である直感的なGUIでのリソース作成・変更ができなくなってしまうからです。
そこでAmazon ConnectのGUIベースの開発を維持しつつ、Terraformでリソースを管理し安全にリリースできる仕組みを整えた事例を紹介したいと思います。
最初にAmazon Connectについて簡単にご紹介します。Amazon Connectは、AWSが提供するクラウドベースのコンタクトセンターサービスです。コンタクトセンターを構築するのに必要な機能が全て搭載されたフルマネージドサービスであるため、迅速かつ低コストでコンタクトセンターを立ち上げることが可能です。主な特徴は以下の通りです。

Amazon Connectの直感的で簡単なGUIベースの開発とIaCによる安定した運用の両方の恩恵を受けるために、以下の開発者体験を実現する、最大限自動化されたシステムを構築することにしました。
全体構成は下の図の通りです。

このシステムによりGUIベースでの開発を維持しつつ、本番環境への変更反映はTerraformを用いて標準的なGitベースのワークフローに落とし込むことができるため安定したリリースが可能になりました。
次にシステムの各コンポーネントの役割を順に解説していきます。
1. トリガー (CloudTrail & EventBridge)
開発者がAmazon ConnectのGUIでコンタクトフローを編集し、「公開」ボタンをクリックすると、AWS内部でUpdateContactFlowContentというAPIが呼び出されます。このAPIコールはCloudTrailによって記録されています 。このCloudTrailのイベントをEventBridgeで検知しStep Functionsを発火させます。
ここで注意が必要なのが、「保存」ボタンを押したときも同じAPIが呼ばれる点です。しかしその際はコンタクトフローIDの末尾に SAVED という文字列が付与される仕様になっています。そこで、EventBridgeのイベントパターンで「contactFlowIdの末尾がSAVED以外であること」という条件を指定することで、「公開」操作のみをトリガーとして捉えることができます。
{ "detail": { "eventName": ["UpdateContactFlowContent"], "eventSource": ["connect.amazonaws.com"], "requestParameters": { "ContactFlowId": [{ "anything-but": { "suffix": "SAVED" } }] } }, "detail-type": ["AWS API Call via CloudTrail"], "source": ["aws.connect"]}2. Amazon Connectのデータ取得+GitHub Actionsのワークフロー発火(Step Functions & S3)
EventBridgeにより発火されたStep Functionsで以下の処理を行います。
3. 変更を反映したPRを作成(GitHub Actions)
コンタクトフローJSON定義の中には、呼び出し先のLambda関数やキュー、プロンプトなどのARN(Amazon Resource Name)がハードコードされています。ARNにはリソース固有のIDが含まれるため、dev環境で作成したコンタクトフローのJSONを、そのまま本番環境に適用することはできません。そのため以下の手順で変更を反映したPRを作成します。
{ "SummaryList": [ { "Name": "test.wav", "Items": [ { "Id": “xyz123”, "Arn": "arn:aws:connect:ap-northeast-1…”, # dev環境のプロンプトのARN "InstanceId": “abc123” # dev環境のInstance ID }, { "Id": “xyz987”, "Arn": "arn:aws:connect:ap-northeast-1…”, # 本番環境のプロンプトのARN "InstanceId": “abc987” # 本番環境のInstance ID } ], "placeholder": "uuid_xyz987” } ]}locals { arn_map = { "uuid_xyz987” = "arn:aws:connect:ap-northeast-1:….”, ….. }} { "Identifier": "ramdom_id", "Parameters": { "InputTimeLimitSeconds": "10", "PromptId": "${uuid_xyz987}", "StoreInput": "False" },自動でPR作成する場合は運用方法に注意する必要があります。複数の開発者が同時にコンタクトフローを更新する可能性があり、意図せず他の人の変更を上書きするリスクがあるためです。このリスクを回避するために次のような中間ブランチを利用する運用を採用しました。

ステージ1:自動PR (変更の隔離)
ステージ2:手動PR (変更の集約と最終確認)
これらの仕組みを導入したことで、開発者体験を大きく向上させることができました。最終的なコンタクトフローの開発運用方法は以下の通りになりました。
Amazon ConnectのGUI開発の利便性とIaCによる安定した運用の両方の恩恵を受けるために行った取り組みを紹介しました。Amazon ConnectのIaC化を検討している方や、運用方法を模索している方に本記事を参考にしていただければ幸いです。
*1:Terraformのdefault_tagsの設定でTerraform管理下のリソースにはManagedBy: terraformというタグが付与されています。
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。