Amazon-Connect-CopyでAmazon Connectインスタンスのコピーをしてみた – Amazon Connect アドベントカレンダー 2022
こんにちは、中川です。
Amazon Connect アドベントカレンダー 2022、9 日目の記事です!
Amazon Connect アドベントカレンダー 2022 はクラスメソッドとギークフィードさんの有志が募ってチャレンジしている企画になります。
本日時点では Amazon Connect の標準としてコピーやバックアップの機能はサポートされておりません。
一部のコンポーネントは CloudFormation に対応しております[1]が、すべてのコンポーネントは対応されていないため全てを IaC で管理することもできないです。
そのため Aamzon Connect の設定をバックアップや同じ設定の他の環境にコピー(非本番から本番)したいようなケースでは、手作業や事前にスクリプトの作り込み必要でした。
Amazon-Connect-Copy は、Amazon Connect インスタンスのコンポーネントをまるっとコピーできる Bash スクリプトで、aws-samples で公開されています。
Amazon Connect インスタンスの複製やバックアップなど数時間かかっていたような作業を数分に減らし、また作り込み不要で簡単に利用できます。
本ブログでは Amazon-Connect-Copy を試してみましたので、ご紹介します。
対象コンポーネント
コピー対象のコンポーネントは以下になります。
サポートされているコンポーネント
- Lambda(事前にデプロイが必要)
- Lex(事前にデプロイが必要)
- プロンプト(事前アップロードが必要)
- オペレーション時間
- キュー
- ルーティングプロファイル
- コンタクトフロー
- コンタクトフローモジュール
サポートされていないコンポーネント
- ユーザー
- セキュリティプロファイル
- 電話番号
- クイック接続
- 既存のキュー
- ヒストリカルメトリクス、レポート
- CTR
- カスタム語彙
- Contact Lens ルール
やってみた
ソースとなるインスタンス(copy-source)をコピーして、ターゲットのインスタンス(copy-target)に複製する流れを行います。
対象とする Amazon Connect のコンポーネントは以下とします。
- Lambda
- プロンプト
- オペレーション時間
- キュー
- コンタクトフロー
前提
以下の前提のもと実行しています。
- 実行環境で以下がインストールされていること
- AWS CLI(動作確認されているバージョン 2.8.6。本ブログでは 2.9.5 を使用)
- jq
- aws-samples/amazon-connect-copy はクローンされて
bin/*
のパスを通していること
準備
リストアの準備として以下を事前に行います。
- 複製のターゲットとなる Amazon Connect インスタンス(copy-target)を作成
- コンタクトフローで使用される Lambda 関数(connect-copy-function)をターゲットのインスタンスに追加
- コンタクトフローで使用されるプロンプト(sample_sound.wav)をターゲットのインスタンスにアップロード
動作確認用に以下のコールフロー、キュー、オペレーション時間を用意しました。
コンタクトフロー(test-flow)
キュー(test-queue)、オペレーション時間(test-operation)
ソースインスタンスを保存
準備ができましたので、ソースインスタンスのコンポートを保存します。保存はconnect_save
コマンドを使用します。
$ connect_save copy-source
実行すると以下のようにコピーされたコンポーネントが出力されます。
Instance Alias: copy-source (in directory "copy-source")
AWS Profile: (default)
Contact Flow Prefix:
Instance ID: 307e58be-45b2-4ca6-829a-a987fde0b515
8 prompts listed in "copy-source/prompts.json"
2 hours of operations listed in "copy-source/hours.json"
Exporting hours of operation Basic Hours
Exporting hours of operation test-operation
2 queues listed in "copy-source/queues.json"
Exporting queue BasicQueue
Exporting queue test-queue
1 routing profiles listed in "copy-source/routings.json"
Exporting routing profile Basic Routing Profile
0 contact flow modules listed in "copy-source/modules.json"
20 contact flows listed in "copy-source/flows.json"
Exporting contact flow Default agent hold
Exporting contact flow Default agent transfer
Exporting contact flow Default agent whisper
Exporting contact flow Default customer hold
Exporting contact flow Default customer queue
Exporting contact flow Default customer whisper
Exporting contact flow Default outbound
Exporting contact flow Default queue transfer
Exporting contact flow Sample AB test
Exporting contact flow Sample Lambda integration
Exporting contact flow Sample disconnect flow
Exporting contact flow Sample inbound flow (first contact experience)
Exporting contact flow Sample interruptible queue flow with callback
Exporting contact flow Sample note for screenpop
Exporting contact flow Sample queue configurations flow
Exporting contact flow Sample queue customer
Exporting contact flow Sample recording behavior
Exporting contact flow Sample secure input with agent
Exporting contact flow Sample secure input with no agent
Exporting contact flow test-flow
All done
ディレクトリを確認すると、各コンポーネントごとにファイルが出力されていました。
$ tree
.
├── copy-source
│ ├── flow_Default%20agent%20hold.json
│ ├── flow_Default%20agent%20transfer.json
│ ├── flow_Default%20agent%20whisper.json
│ ├── flow_Default%20customer%20hold.json
│ ├── flow_Default%20customer%20queue.json
│ ├── flow_Default%20customer%20whisper.json
│ ├── flow_Default%20outbound.json
│ ├── flow_Default%20queue%20transfer.json
│ ├── flow_Sample%20AB%20test.json
│ ├── flow_Sample%20Lambda%20integration.json
│ ├── flow_Sample%20disconnect%20flow.json
│ ├── flow_Sample%20inbound%20flow%20%28first%20contact%20experience%29.json
│ ├── flow_Sample%20interruptible%20queue%20flow%20with%20callback.json
│ ├── flow_Sample%20note%20for%20screenpop.json
│ ├── flow_Sample%20queue%20configurations%20flow.json
│ ├── flow_Sample%20queue%20customer.json
│ ├── flow_Sample%20recording%20behavior.json
│ ├── flow_Sample%20secure%20input%20with%20agent.json
│ ├── flow_Sample%20secure%20input%20with%20no%20agent.json
│ ├── flow_test-flow.json
│ ├── flows.json
│ ├── hour_Basic%20Hours.json
│ ├── hour_test-operation.json
│ ├── hours.json
│ ├── instance.json
│ ├── instance.var
│ ├── modules.json
│ ├── prompts.json
│ ├── queue_BasicQueue.json
│ ├── queue_test-queue.json
│ ├── queues.json
│ ├── routingQs_Basic%20Routing%20Profile.json
│ ├── routing_Basic%20Routing%20Profile.json
│ └── routings.json
└── copy-source.log
保存はこれだけで完了です。
ターゲットインスタンスにコピー
次に保存したコンポーネントをターゲットにコピーをしていきます。
ソースインスタンスとターゲットインスタンスの設定を比較をするため、ターゲットインスタンスでも同じようにconnect_save
コマンドを実行します。
$ connect_save copy-target
ターゲットで作成・更新したくないコンポーネントがあれば、ヘルパーファイルを利用できます。
ヘルパーファイルは connect_diff helper
コマンドを実行して作成されます。
$ connect_diff copy-source copy-target helper
実行すると helper ディレクトリが作成され、コンポーネントの比較や変数が定義されたファイルが作成されます。
$ tree helper/
helper/
├── flow_template.json
├── helper.new
├── helper.old
├── helper.sed
├── helper.var
└── module_template.json
- helper.new:新規作成するコンポーネント(ソースにあって、ターゲットにないもの)
- helper.old:更新するコンポーネント(ソースとターゲットにあるもの)
- helper.sed:参照を修正する SED スクリプト
- helper.var:2 インスタンスの変数(インスタンス名や Lambda プレフィックスなど)
helper.new を開くと、以下のように新規作成するコンポーネントが書かれています。もし、この中にターゲットに作成したくないコンポーネントがあれば直接ファイルを修正します。
[text]
hour_test-operation.json
queue_test-queue.json
flow_test-flow.json
[/text]
以上でコピーの準備ができました。
コピーはconnect_copy helper
コマンドを実行します。-d
オプションを付けて実行するとドライランできるので、まずドライランから実行します。
$ connect_copy -d helper
Dry Run
Instance Alias A: copy-source (in directory "copy-source")
Instance Alias B: copy-target (in directory "copy-target")
Helper Directory: helper
AWS Profile B in use: (default)
Context Flow Prefix:
Prompts
-------
All prompts in the source instance exist in the target instance.
Hours of operations
-------------------
Creating 1 Hours of operations
1. hour_test-operation.json
Dry-create hours of operation
{
"Name": "test-operation",
"Description": "test-operation",
"TimeZone": "Japan",
"Config":[
{
"Day": "WEDNESDAY",
"StartTime": {
"Hours": 9,
"Minutes": 0
},
"EndTime": {
"Hours": 17,
"Minutes": 0
}
},
{
"Day": "FRIDAY",
"StartTime": {
"Hours": 9,
"Minutes": 0
},
"EndTime": {
"Hours": 17,
"Minutes": 0
}
},
{
"Day": "TUESDAY",
"StartTime": {
"Hours": 9,
"Minutes": 0
},
"EndTime": {
"Hours": 17,
"Minutes": 0
}
},
{
"Day": "SUNDAY",
"StartTime": {
"Hours": 9,
"Minutes": 0
},
"EndTime": {
"Hours": 17,
"Minutes": 0
}
},
{
"Day": "SATURDAY",
"StartTime": {
"Hours": 9,
"Minutes": 0
},
"EndTime": {
"Hours": 17,
"Minutes": 0
}
},
{
"Day": "THURSDAY",
"StartTime": {
"Hours": 9,
"Minutes": 0
},
"EndTime": {
"Hours": 17,
"Minutes": 0
}
},
{
"Day": "MONDAY",
"StartTime": {
"Hours": 9,
"Minutes": 0
},
"EndTime": {
"Hours": 17,
"Minutes": 0
}
}
],
"Tags": {},
"InstanceId": "5b0d02cb-b32b-4f84-900d-e77e9938f552"
}
Checking 1 hours of operations for an update
1. hour_Basic%20Hours.json ... same
Queues
------
Creating 1 queues
1. queue_test-queue.json
Dry-create queue
{
"Name": "test-queue",
"Description": "test",
"HoursOfOperationId": "b364d55f-5cd7-471b-88e1-5b9042dd4c61",
"Tags": {},
"InstanceId": "5b0d02cb-b32b-4f84-900d-e77e9938f552"
}
Checking 1 queues for an update
1. queue_BasicQueue.json ... same
Routing Profiles
----------------
No routing profiles to create
No routing profiles to update
Contact Flow Modules Creation
-----------------------------
No contact flow modules to create
Contact Flows Creation
----------------------
Creating 1 contact flows
1. flow_test-flow.json
Dry-create contact flow from Template (Default flows)
--instance-id 5b0d02cb-b32b-4f84-900d-e77e9938f552
--name "test-flow"
--type CONTACT_FLOW
Contact Flow Modules Update
---------------------------
No contact flow modules to update
Contact Flows Update
--------------------
Checking 19 contact flows for an update
1. flow_Default%20agent%20hold.json ... same
2. flow_Default%20agent%20transfer.json ... same
3. flow_Default%20agent%20whisper.json ... same
4. flow_Default%20customer%20hold.json ... same
5. flow_Default%20customer%20queue.json ... same
6. flow_Default%20customer%20whisper.json ... same
7. flow_Default%20outbound.json ... same
8. flow_Default%20queue%20transfer.json ... same
9. flow_Sample%20AB%20test.json ... same
10. flow_Sample%20Lambda%20integration.json ... same
11. flow_Sample%20disconnect%20flow.json ... same
12. flow_Sample%20inbound%20flow%20%28first%20contact%20experience%29.json ... same
13. flow_Sample%20interruptible%20queue%20flow%20with%20callback.json ... same
14. flow_Sample%20note%20for%20screenpop.json ... same
15. flow_Sample%20queue%20configurations%20flow.json ... same
16. flow_Sample%20queue%20customer.json ... same
17. flow_Sample%20recording%20behavior.json ... same
18. flow_Sample%20secure%20input%20with%20agent.json ... same
19. flow_Sample%20secure%20input%20with%20no%20agent.json ... same
3 actions on the target instance
The AWS CLI commands carrying out such actions can be found in: helper.log
No actions were carried out in Dry-run mode
ドライランの実行内容を確認して問題なければ、コピーを実行します。
$ connect_copy helper
Instance Alias A: copy-source (in directory "copy-source")
Instance Alias B: copy-target (in directory "copy-target")
Helper Directory: helper
AWS Profile B in use: (default)
Context Flow Prefix:
Prompts
-------
All prompts in the source instance exist in the target instance.
Hours of operations
-------------------
Creating 1 Hours of operations
1. hour_test-operation.json
Checking 1 hours of operations for an update
1. hour_Basic%20Hours.json ... same
Queues
------
Creating 1 queues
1. queue_test-queue.json
Checking 1 queues for an update
1. queue_BasicQueue.json ... same
Routing Profiles
----------------
No routing profiles to create
No routing profiles to update
Contact Flow Modules Creation
-----------------------------
No contact flow modules to create
Contact Flows Creation
----------------------
Creating 1 contact flows
1. flow_test-flow.json
Contact Flow Modules Update
---------------------------
No contact flow modules to update
Contact Flows Update
--------------------
Checking 20 contact flows for an update
1. flow_Default%20agent%20hold.json ... same
2. flow_Default%20agent%20transfer.json ... same
3. flow_Default%20agent%20whisper.json ... same
4. flow_Default%20customer%20hold.json ... same
5. flow_Default%20customer%20queue.json ... same
6. flow_Default%20customer%20whisper.json ... same
7. flow_Default%20outbound.json ... same
8. flow_Default%20queue%20transfer.json ... same
9. flow_Sample%20AB%20test.json ... same
10. flow_Sample%20Lambda%20integration.json ... same
11. flow_Sample%20disconnect%20flow.json ... same
12. flow_Sample%20inbound%20flow%20%28first%20contact%20experience%29.json ... same
13. flow_Sample%20interruptible%20queue%20flow%20with%20callback.json ... same
14. flow_Sample%20note%20for%20screenpop.json ... same
15. flow_Sample%20queue%20configurations%20flow.json ... same
16. flow_Sample%20queue%20customer.json ... same
17. flow_Sample%20recording%20behavior.json ... same
18. flow_Sample%20secure%20input%20with%20agent.json ... same
19. flow_Sample%20secure%20input%20with%20no%20agent.json ... same
20. flow_test-flow.json ... changed
Associating Lambda functions to copy-target
1. arn:aws:lambda:ap-northeast-1:12345678XXXX:function:connect-copy-function ... already associated
4 actions on the target instance
The AWS CLI commands carrying out such actions can be found in: helper.log
All done
ターゲットインスタンスに接続すると、期待通りフローやオペレーション時間が作成され、正常にコピーできていることを確認できました!
さいごに
Amazon Connect インスタンスのコピーをできる Amazon-Connect-Copy を試してみました。
簡単にインスタンスのコピーができますので、環境の複製やバックアップ・リストアをしたいときに便利なツールです。すべてのコンポーネントをコピーはできませんので、利用状況に応じて追加でスクリプトの用意や操作を合わせて検討したいです。