Amazon Connectの問い合わせフローをAPIから作成できるようになったので、使ってみました

記事タイトルとURLをコピーする

はじめに

こんにちは、孔子の80代目子孫兼技術4課の孔です。9月もそろそろ終わりとなり、寒くなってきましたね。私は寒い方が好きなので、やっと夏が終わって嬉しい限りです。

ということで、今回はAmazon Connectのアップデートに関するお話しとなります。先日、Amazon Connectに関する以下の二つのアップデートが発表されました。

Amazon Connect launches API to configure routing profiles programmatically

Amazon Connect launches contact flow management APIs

ルーティングプロファイルおよび問い合わせフローを管理するためのAPIが複数公開されました!てってれー!これは嬉しいですね!

具体的に何が変わって、何が嬉しいのか、みていきたいと思います。それでは、始めましょう!

更新内容

「はじめに」で貼った、二つのURLを読んでみると、以下の内容が更新されたことがわかります。

  • ルーティングプロファイルの作成、更新がAPIを使ってできるようになりました
  • 問い合わせフローの作成、記述(Describe)、更新、公開がAPIを使ってできるようになりました

以上となります。Amazon Connectは、今までこのようなリソースを作成するためのAPIがあまり公開されてなかったので、今回のアップデートによってAmazon Connectを使った開発がより楽になるのではないかと思います。それでは、何が楽になるのか、今回のアップデートがどんなメリットがあるのか、みていきましょう。

何が嬉しいの?

ルーティングプロファイルに関しては、状況に応じて動的にルーティングプロファイルで設定したキューに対する優先度や遅延を変更できるようになったことが大きなメリットとなります。 例えば、ある家電メーカー様で、掃除機とカメラにそれぞれ優先度「1」と「2」を持ち、遅延が「0秒」「60秒」を持ったルーティングプロファイルがあるとします。

f:id:swx-kong:20200923183141p:plain

ある日、なぜかカメラのお問い合わせが殺到してきました。予想できる状態であれば(新しいカメラを発売したなどの状況ですね)事前にルーティングの設定をカメラの優先度をあげたり、遅延時間を減らしたりすることで対応できたものの、今回は全く予想外に急なスパイクが発生しました。 従来であれば、急なスパイクが発生していることが分かったら、プーティングプロファイルを手動で修正したりする対応をするしかなかったですね。 しかし、今回新しく公開された update_routing_profile_queues を使うと、コール数にスパイクが発生したことを監視ツールなどで分かった瞬間にコードを発火させ、即座でルーティングプロファイルを変更することで柔軟にオペレーターを配分できる仕組みを自動化することができます。

また、問い合わせフローに関しても、作成する際に動的に値を変更することができますので、従来手動で作成してた時より環境を分けてフローを作成することができます。 こちらの問い合わせフローに関しては、直接触ってみながら説明していきましょう!

使ってみた

それでは、使ってみましょう!今回はPythonを使ってAPIを使ってみることにします。以下のリンクがboto3のドキュメントとなりますので、ご参照ください。

Connect — Boto3 Docs 1.15.4 documentation

今回試してみるAPIはcreate_contact_flowとなります。作成するフローは以下のフローとなります。

f:id:swx-kong:20200924112834p:plain

とてもシンプルなフローですね。create_contact_flowAPIをコールするためのリクエスト様式を確認してみると、以下のようになっています。

import boto3

client = boto3.client('connect')

response = client.create_contact_flow(
    InstanceId='string',
    Name='string',
    Type='CONTACT_FLOW'|'CUSTOMER_QUEUE'|'CUSTOMER_HOLD'|'CUSTOMER_WHISPER'|'AGENT_HOLD'|'AGENT_WHISPER'|'OUTBOUND_WHISPER'|'AGENT_TRANSFER'|'QUEUE_TRANSFER',
    Description='string',
    Content='string',
    Tags={
        'string': 'string'
    }
)

それぞれの引数は以下のようになります。

  • InstanceId:問い合わせフローを作成する対象となるインスタンスのIDを指定します。(必須)
  • Name:作成する問い合わせフローの名前となります。(必須)
  • Type:どのタイプの問い合わせフローを作成するかを指定します。問い合わせフローに関してはこちらのリンクをご確認ください(必須)
  • Description:問い合わせフローの説明を記載します。(任意)
  • Content:問い合わせフローの内容を記載します。後ほど詳しく説明します。(必須)
  • Tags:問い合わせフローにつけるタグを指定します。(任意)

ここでContentですが、Contentはフロー図を記載した内容となります。今回作成するContentを記述すると、以下のようになります。

{
  "Version": "2019-10-30",
  "StartAction": "9a594f8b-d5a9-416c-88ce-652a5a926f5d",
  "Metadata": {
    "entryPointPosition": { "x": 20, "y": 20 },
    "snapToGrid": false,
    "ActionMetadata": {
      "9a594f8b-d5a9-416c-88ce-652a5a926f5d": {
        "position": { "x": 158, "y": 26 },
        "useDynamic": false
      },
      "b628233f-19b8-49b0-a6b7-4fcdeac41997": {
        "position": { "x": 412, "y": 30 }
      }
    }
  },
  "Actions": [
    {
      "Identifier": "9a594f8b-d5a9-416c-88ce-652a5a926f5d",
      "Parameters": { "Text": "こんにちは" },
      "Transitions": {
        "NextAction": "b628233f-19b8-49b0-a6b7-4fcdeac41997",
        "Errors": [],
        "Conditions": []
      },
      "Type": "MessageParticipant"
    },
    {
      "Identifier": "b628233f-19b8-49b0-a6b7-4fcdeac41997",
      "Type": "DisconnectParticipant",
      "Parameters": {},
      "Transitions": {}
    }
  ]
}

どのブロックを配置するか、それぞれのブロックをどこに配置するか、ブロックのパラメータはどうなるか、などを記述したものとなります。これを手書きするのはもう不可能に近いことですね…

ですので、今回はいったん問い合わせフローを作成し、そのフローに対して新しくアップデートされたdescribe_contact_flowAPIをコールします。するとこのContent情報を取ることができますので、それをそのまま利用し、create_contact_flowを作成します。

import boto3

client = boto3.client('connect')

response = client.describe_contact_flow(
    InstanceId='string',
    ContactFlowId='string'
)

インスタンスと問い合わせフローを作成し、それぞれのIDを入れましょう。問い合わせフローを作成し、保存したら、それぞれのIDは以下の方法で確認できます。

f:id:swx-kong:20200924113825p:plain

これでdescribe_contact_flowをコールすると、以下の形式でリスポンスが帰ってきます。

{
    'ContactFlow': {
        'Arn': 'string',
        'Id': 'string',
        'Name': 'string',
        'Type': 'CONTACT_FLOW'|'CUSTOMER_QUEUE'|'CUSTOMER_HOLD'|'CUSTOMER_WHISPER'|'AGENT_HOLD'|'AGENT_WHISPER'|'OUTBOUND_WHISPER'|'AGENT_TRANSFER'|'QUEUE_TRANSFER',
        'Description': 'string',
        'Content': 'string',
        'Tags': {
            'string': 'string'
        }
    }
}

ContactFlow.Contentの中身が、先ほど貼ったContentの中身となります。これをそのまま使えば同じ問い合わせフローを作成することができますので、やってみましょう。

import boto3

client = boto3.client('connect')

response = client.describe_contact_flow(
    InstanceId='string',
    ContactFlowId='string'
)

client.create_contact_flow(
    InstanceId='string',  # インスタンスID(必須)
    Name='Test Contact Flow from boto3',  # 問い合わせフローの名前(必須)
    Type='CONTACT_FLOW',  # 問い合わせフローのタイプ(必須)
    Content=response['ContactFlow']['Content'],  # 問い合わせのコンテンツ(必須)
)

すると

f:id:swx-kong:20200924114134p:plain

このように、「Test Contact Flow from boto3」という名前の、先ほどと同じ問い合わせフローが作成できました!

Contentを手動で記入することがほぼ不可能に近いので、いったん手動で問い合わせフローを作成してDescribeする過程が必要なのは少し手間ですが、今の段階ではこれで満足しましょう。コードを実行する際にパラメータの値によってインスタンスIDや名前、Contentなどを動的に変更できれば環境い合わせてデプロイ内容を変えたりすることができますので、今後運用の手間を減らしたりすることができるのが大きなメリットとなります。

さいごに

従来は、ルーティングプロファイルや問い合わせフローの作成を自動化したり、動的にアップデートしたりする仕組みを作るがなかなか難しかったものの、今回のアップデートによってそこら辺がとても楽になったのではないかと思います。Amazon Connect使ってどんどん開発が進みますね!

以上となります。ありがとうございました!