音声再生設定部分については、CTI Adapter for Salesforce v5.15より、CloudFrontを使用しないよう変更されました。最新の手順については公式ページをご確認ください。
Amazon Connect CTI Adapter for Salesforce(以下CTIアダプタ)を利用し、セールスフォース上で音声データを再生する設定をしてみましたので、注意ポイントなどを紹介します
セールスフォースのページ上で下記のように、会話の文字起こし、感情分析が表示され、音声再生も可能となります

- 前提環境
- 手順
- CTIアダプタパッケージインストール(セールスフォース)
- Lambdaパッケージインストール(AWS)
- コンタクトチャネル分析の設定
- Call Recording Import (1)
- Call Recording Import (2~5)
- Call Recording Import (6~10)
- Call Recording Import (11~14)
- Call Recording Import (15)
- Call Recording Import (16~20)
- Salesforce Side Setup
- Enabling call recording import
- Adding Contact Channel Analytics to the Service Console
- Recording Transcripts
- Enabling recording transcription
- AI Driven Contact Analysis
- 動作確認
- 最後に
前提環境
- Amazon Connect CTI Adapter for Salesforce v5.7
- Salesforce Developer Edition
CTIアダプタはアップデートが早く、仕組みも結構ダイナミックに変更されるので、対象となるバージョンはよく確認されることをおすすめします
v5.0がリリースされたのが2020年8月、その3ヶ月後の11月には今回のv5.7がリリースされています
手順
CTIアダプタパッケージインストール(セールスフォース)
CTIアダプタをセールスフォースへインストールする手順は従来と同様、AppExchangeからのインストールと各種設定となっています
下記記事に注意点がありますので、ご参照ください
なお、今回からインストールガイドがgithubへのリンクとなっています。 PDFですが、ベースとなる情報も同じリポジトリにあるので、PDFだと読みにくい場合はソースを参照することも可能です
https://github.com/amazon-connect/amazon-connect-salesforce-cti/blob/main/util/lightning.pdf
https://github.com/amazon-connect/amazon-connect-salesforce-cti/tree/main/lightning
Lambdaパッケージインストール(AWS)
インストールガイド 「Installing the Amazon Connect Salesforce Lambda Package」 セクション部分に沿って設定します
手順が少し複雑なので、ステップごとに手順と注意ポイントを残します
Check your Salesforce API Version
手順どおり、セールスフォースのApex ClassページからAPIバージョンを確認します
今回実施した際のバージョンは 50.0 でした
Create a New Connected App
設定→アプリケーションマネージャ→新規接続アプリケーション を操作し、 Amazon Connect Integration 接続アプリケーションを作成します
下記を控えておきます
- コンシューマ鍵
- コンシューマの秘密



Create a new API user
APIアクセス用のユーザーを作成します
実際に設定するのは下記となります
API_ONLYプロファイル作成Amazon Connect Integration接続アプリケーションへAPI_ONLYプロファイルを関連付けapiuserユーザ作成apiuserユーザをAC_Administrator権限セットへ関連付けapiuserユーザのセキュリティトークン払い出し
下記を控えておきます
apiuserのユーザ名apiuserのパスワードapiuserのセキュリティトークン

Gather Information from Your Amazon Connect Instance
Amazon Connectインスタンス側の情報を確認します
下記を控えておきます
- Amazon ConnectインスタンスID
- 通話記録保存先 S3バケット名
- エクスポートされたレポート S3バケット名
音声データ関連の処理は問い合わせ追跡レコード(CTR)作成イベントをトリガーに実行されるため、Kinesis Data Streamが必要になります。 (別途Kinesis利用料金が発生します)
Kinesisストリームを作成し、Amazon Connectインスタンスへ指定します
データストリーミング→問い合わせ追跡レコード
また、KinesisストリームのARNを控えておきます
- 問い合わせ追跡レコードに指定したKinesisストリームARN


Store Salesforce Credentials in AWS Secrets Manager
セールスフォースへのクレデンシャルを AWS Secrets Manager へ保存します
操作が前後するのですが、先に、シークレット作成ページの下部「新しいキーを追加」から暗号化キーを作成し、作成したキーのARNを控えておきます

シークレットへクレデンシャル情報(コンシューマ鍵、コンシューマの秘密、パスワード、セキュリティトークン)を指定し、シークレットを作成します
作成したシークレットのARNを控えておきます


Install the Amazon Connect Salesforce Lambda package
Lambdaパッケージをインストールします(やっと)
ここまでの手順で設定/確認してきた各種値をパラメータ設定してデプロイします

SalesforceHostの指定値はセールスフォース→設定→私のドメインページで確認できます
表示されているドメイン名の先頭に https:// を付加した文字列を指定します
DeveloperEditionであれば、下記のようになります
https://yourorgname-dev-ed.my.salesforce.com

設定パラメータ
| パラメータ | 設定値・例 | 補足 |
|---|---|---|
| アプリケーション名 | AmazonConnectSalesforceLambda | デフォルト値 |
| CTRKinesisARN | arn:aws:kinesis:ap-northeast-1:000000000000:stream/connect-ctr-stream | 上記手順で作成したKinesisストリームARN |
| ConnectReportingS3BucketName | connect-xxxxxx | 上記手順で控えた エクスポートされたレポート S3バケット名 |
| HistoricalReportingImportEnabled | true | デフォルト値 |
| LambdaLoggingLevel | INFO | デフォルト値 |
| PrivateVpcEnabled | false | デフォルト値 |
| RealtimeReportingImportEnabled | true | デフォルト値 |
| SalesforceAdapterNamespace | amazonconnect | デフォルト値 |
| SalesforceCredentialsKMSKeyARN | arn:aws:kms:ap-northeast-1:000000000000:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | 上記手順で作成したキー(KMS)のARN |
| SalesforceCredentialsSecretsManagerARN | arn:aws:secretsmanager:ap-northeast-1:000000000000:secret:SalesforceCredentials1-xxxxxx | 上記手順で作成したシークレット(Secrets Manager)のARN |
| SalesforceHost | https://xxxxxxx-dev-ed.my.salesforce.com | セールスフォース私のドメインURL |
| SalesforceProduction | true | デフォルト値(本番組織/DE組織はtrue,Sandboxはfalse) |
| SalesforceUsername | your-apiuser@example.com | apiuser のユーザID |
| SalesforceVersion | v50.0 | 上記手順で確認したセールスフォースAPIバージョン |
| VpcSecurityGroupList | (ブランク) | デフォルト値 |
| VpcSubnetList | (ブランク) | デフォルト値 |
| AmazonConnectInstanceId | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | 上記手順で確認したConnectインスタンスID |
| AmazonConnectQueueMaxRecords | 100 | デフォルト値 |
| AmazonConnectQueueMetricsMaxRecords | 100 | デフォルト値 |
| CTREventSourceMappingMaximumRetryAttempts | 100 | デフォルト値 |
| ConnectRecordingS3BucketName | connect-xxxxxx | 上記手順で控えた 通話記録保存先 S3バケット名 |
| PostcallCTRImportEnabled | true | デフォルト値 |
| PostcallRecordingImportEnabled | true | デフォルト値 |
| PostcallTranscribeEnabled | true | デフォルト値 |
| TranscribeOutputS3BucketName | connect-xxxxxx | 上記手順で控えた 通話記録保存先 S3バケット名 |
| TranscriptionJobCheckWaitTime | 20 | デフォルト値 |
Test the Core Functionality
デプロイしたLambda関数をテスト実行し、セールスフォースへアクセスできるか確認します
インストールガイドの手順だと下記のようなエラーになりました
{
"errorMessage": "An error occurred (AccessDeniedException) when calling the PutSecretValue operation: Access to KMS is not allowed",
"errorType": "ClientError",
"stackTrace": [
" File \"/var/task/sfInvokeAPI.py\", line 41, in lambda_handler\n sf.sign_in()\n",
手順にはありませんが、上記手順で作成したキー(KMS)のキーユーザーとして、Lambda実行ロールを追加します

Lambdaからセールスフォースへアクセスし、データ取得ができることを確認します

コンタクトチャネル分析の設定
続いて、インストールガイド 「Contact Channel Analytics」 セクション部分に沿って設定します こちらも、ステップごとに手順と注意ポイントを残します
Call Recording Import (1)
下記ドキュメントに沿ってCloudFrontの設定を行います
(慣れていないとちょっと複雑な作業になるかもしれません)
- ローカル環境でキーペアを作成
- CloudFrontへパブリックキーをアップロード
- CloudFrontキーグループを作成し、アップロードしたパブリックキーを関連付け
- CloudFrontディストリビューションの署名者として、キーグループを関連付け
パブリックキーを作成します
パブリックキーIDを控えておきます

キーグループを作成します

ディストリビューションへ署名者を設定
(ディストリビューションはLambdaパッケージインストール手順で作成されています)

設定結果

Call Recording Import (2~5)
上記で作成したキーペアの秘密鍵をSecrets Managerへ設定します
CloudFrontPrivateKey へは、秘密鍵は改行文字をスペース文字へ置換して長い文字列として設定します
テキストエディタで置換するか、シェルなら tr コマンドを利用して下記のようにして置換できます
$ tr '\n' ' ' < private_key.pem
CloudFrontAccessKeyID へは、上記手順で控えたCloudFrontパブリックキーIDを指定します

Call Recording Import (6~10)
音声データが保存されているS3バケットのCORS設定です
アクセス元となる、セールスフォース側のページ(Visualforceページ)URLを許可する設定になります

Call Recording Import (11~14)
IAMユーザを作成します
作成されているポリシー(invokeSfGenerateAudioRecordingStreamingURLPolicy)を適用し、最後にアクセスキーIDとシークレットアクセスキーを控えておきます

Call Recording Import (15)
Lambda関数 sfGenerateAudioRecording のフルネームを控えておきます
(後続の手順でセールスフォースへ設定します)
serverlessrepo-AmazonConn-sfGenerateAudioRecording-XXXXXXXXXX のようになります
Call Recording Import (16~20)
CloudFrontで使用するLambda関数を作成します
Lambda@Edgeとしてデプロイするため、リージョンは us-east-1 を指定します
最後にCloudFrontディストリビューションを指定してデプロイします
Salesforce Side Setup
Named Credentialを設定します
日本語表示の場合は 指定ログイン情報 になります
(訳がなかなか分かりにくい印象)

利用するユーザを権限セット AC_CallRecording へ追加します
Enabling call recording import
音声連携機能を有効にするため、Amazon Connectの問い合わせフローを修正します
問い合わせ属性 postcallRecordingImportEnabled へ true をセットします
(逆にいうと、音声連携したくないフローはこの属性をセットしないようにします)
Adding Contact Channel Analytics to the Service Console
セールスフォースのページにコンタクトチャネル分析が表示されるように設定します

補足ですが、音声データを保存するために、問い合わせフロー内で通話記録を有効にしておく必要がありますので確認しておきます

Recording Transcripts
Amazon Transcribe を利用した音声の文字起こし設定を行います
Enabling recording transcription
機能を有効にするため、Amazon Connectの問い合わせフローを修正します
問い合わせ属性へ下記設定すると、その通話について文字起こし機能が実行されます
こちらも、機能を実行したくない場合は属性を設定しないか、true 以外を設定すれば良いので、フローによって柔軟に設定可能です
postcallTranscribeEnabledへtrueを設定postcallTranscribeLanguageへja-JPを設定(日本語の場合)
AI Driven Contact Analysis
Amazon Comprehend を利用した感情分析機能を有効にします
文字起こしと同様、Amazon Connectの問い合わせフローを修正します
問い合わせ属性へ下記設定します
postcallTranscribeComprehendAnalysisへsnt,dl,kw- 必要な機能をカンマ区切りで指定します
指定可能な機能と値は下記のようになっています
注意: Syntax Analysis は現状日本語対応していません。指定するとエラーとなり、情報連携されません
| 値 | 機能 |
|---|---|
| snt | Sentiment Analysis 感情分析 |
| kw | Keyphrase Extraction キーフレーズ抽出 |
| dl | Language Detection 言語検出 |
| ne | Custom Entities カスタムエンティティ |
| syn | Syntax Analysis 構文解析 |
動作確認
通話終了後、1分程度でセールスフォースページ上で音声再生が可能に、さらに数分待つと文字起こし結果が表示されます 🙌
(通話とは、アフターコールワークを含みます)

最後に
CTIアダプタv4系では音声ファイルが添付される、つまりセールスフォースのストレージに複製される動作でしたが、本バージョンではS3のファイルを直接参照、再生する仕組みに変更になっています
複製すると保持期間ポリシーなどの運用・管理も煩雑になると思いますので、そのあたりを考慮したアップデートと推測しています
AWSとSalesforce、AWSの中でも複数のサービスを組み合わせて利用するため、簡単設定とはとても言えませんが、機能は充実してきている印象ですね