前提条件
Saleforce API Version : v55.0
serverlessrepo-AmazonConnectSalesforceLambda : 5.19.0
この記事は、2022/10頃に書かれています。
serverlessrepo-AmazonConnectSalesforceLambda : 5.19.0のバージョン固有で、githubのissue(後述)にもあがっているようなので、その内、VerUpで解消されると思われます。
同じハマり方をした人に届いたらいいな?と自分への備忘も兼ねて
モジュールの修正&デプロイは自己責任でお願いします。
トラブルの内容
公式のインストール手順書は下記の通り
この手順通りに設定してもデータ連携ができなかった。というのが、今回の記事の主旨になります。
初見の視点で手順書からは分かりにくい前提や、躓きやすい事を、備忘録として書き残しておきます。
エラーの内容
Lambda:serverlessrepo-AmazonConnectS-sfProcessContactLens-xxxxxxxxxx で、下記のエラーが発生します。
[ERROR] ClientError: An error occurred (404) when calling the HeadObject operation: Not Found
Traceback (most recent call last):
File "/var/task/sfProcessContactLens.py", line 94, in lambda_handler
raise e
File "/var/task/sfProcessContactLens.py", line 69, in lambda_handler
oMetadata = getS3FileMetadata(os.environ['TRANSCRIPTS_DESTINATION'], contactId)
File "/var/task/sf_util.py", line 116, in getS3FileMetadata
response = s3.head_object(Bucket=Bucket, Key='locks/' + ContactId + '.lock')
File "/opt/python/lib/python3.7/site-packages/botocore/client.py", line 357, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/opt/python/lib/python3.7/site-packages/botocore/client.py", line 661, in _make_api_call
raise error_class(parsed_response, operation_name)
[ERROR] ClientError: An error occurred (404) when calling the HeadObject operation: Not Found Traceback (most recent call last): File "/var/task/sfProcessContactLens.py", line 94, in lambda_handler raise e File "/var/task/sfProcessContactLens.py", line 69, in lambda_handler oMetadata = getS3FileMetadata(os.environ['TRANSCRIPTS_DESTINATION'], contactId) File "/var/task/sf_util.py", line 116, in getS3FileMetadata response = s3.head_object(Bucket=Bucket, Key='locks/' + ContactId + '.lock') File "/opt/python/lib/python3.7/site-packages/botocore/client.py", line 357, in _api_call return self._make_api_call(operation_name, kwargs) File "/opt/python/lib/python3.7/site-packages/botocore/client.py", line 661, in _make_api_call raise error_class(parsed_response, operation_name)
問題点(状況証拠からの推測含む)
エラーメッセージの内容からすると、『Comprehend / Transcribe』の処理中?スキップ用のロックファイル(.lockファイル)を確認しようとして、ファイルが存在しない(S3的に言うとファイルが存在しない)為、エラーで落ちている。
こちらのロックファイルは、『Contact Trace Records』の連携機能を有効にしている場合は作成されます。
今回の検証の場合、『Contact Lens』だけの検証をしようとしており、『Contact Trace Records』の設定をしていなかった為に、Lambdaでエラーとなっていた。
Githubのissueに登録があった
リポジトリのコミッターが、
- 『Comprehend / Transcribe』と『Contact Lens』の両方を有効にしている場合に、レコードが重複して作成されない為の措置である。
- Lambdaの環境変数設定:TranscribeOutputS3BucketNameが未設定の場合はチェックをしないべきである。
とコメントしてますね。
将来は、『Contact Lens』のデータ連携が単独で有効できる修正がバージョンアップで入る(であろう)という事と理解した。
ワークアラウンドとして、、、
『Contact Trace Records』を設定してしまえば、正常に挙動はするようだが、今回は、issueのコメントにあるモジュールの暫定修正の手順をメモを残しておく。
現行Lambdaのエクスポート(動作してるLambdaのダウンロード)
※ ダウンロードしたZipは、修正前バックアップを確保しておくこと
コード編集(69行目、72行目、73行目、89行目のコメントアウト)
Zipを解凍したフォルダから『sfProcessContactLens.py』をエディタで開き、issueで指摘されていた行をコメントアウトする。
logger.info('Getting lock file metadata: %s ' % contactId)
- oMetadata = getS3FileMetadata(os.environ['TRANSCRIPTS_DESTINATION'], contactId)
+ # oMetadata = getS3FileMetadata(os.environ['TRANSCRIPTS_DESTINATION'], contactId)
mACContactChannelAnalyticsId = None
- if 'ACContactChannelAnalyticsId'.lower() in oMetadata:
- mACContactChannelAnalyticsId = oMetadata['ACContactChannelAnalyticsId'.lower()]
+ # if 'ACContactChannelAnalyticsId'.lower() in oMetadata:
+ # mACContactChannelAnalyticsId = oMetadata['ACContactChannelAnalyticsId'.lower()]
logger.info('Processing ContactLens transcript')
participants = contactLensObj['Participants']
ContactLensTranscripts = processContactLensTranscript(contactLensObj['Transcript'], participants)
# customerTranscripts = ','.join(str(transcript) for transcript in ContactLensTranscripts['customerTranscripts'])
# agentTranscripts = ','.join(str(transcript) for transcript in ContactLensTranscripts['agentTranscripts'])
contactLensTranscripts = ContactLensTranscripts['finalTranscripts']
logger.info('Processing Conversation Characteristics')
contactLensConversationCharacteristics = processContactLensConversationCharacteristics(contactLensObj, bucket, contactLensTranscripts)
createSalesforceObject(contactId, contactLensTranscripts, contactLensConversationCharacteristics, mACContactChannelAnalyticsId)
logger.info('Updating s3 metadata')
- updateLock(os.environ['TRANSCRIPTS_DESTINATION'], contactId, oMetadata)
+ # updateLock(os.environ['TRANSCRIPTS_DESTINATION'], contactId, oMetadata)
Zipの作り直し
Lambda側の基本知識ですが、解凍した階層にファイルが直ぐに展開される必要があるので、下記のようなコマンドで圧縮すること。
圧縮ツールなどを利用する際には、どういう階層で圧縮されるか理解した上で設定して利用すること。
下記のように解凍して展開されたファイル全てを含めて圧縮し直す。
cd 【解凍したフォルダ】
zip -r serverlessrepo-AmazonConnectS-sfProcessContactLens-【ダウンロードしたZipファイル名】.zip event-create.json event-lookup.json event-phoneLookup.json event-update.json libcrypto.so.1.0.0 libssl.so.1.0.0 salesforce.py sf_util.py sfComprehendUtil.py sfContactLensUtil.py sfContactTraceRecord.py sfCTRTrigger.py sfExecuteAWSService.py sfExecuteTranscriptionStateMachine.py sfGetTranscribeJobStatus.py sfIntervalAgent.py sfIntervalQueue.py sfInvokeAPI.py sfProcessContactLens.py sfProcessTranscriptionResult.py sfRealTimeQueueMetrics.py sfRealTimeQueueMetricsLoopJob.py sfSubmitTranscribeJob.py template.yaml
Lambdaのアップロード
ワークアラウンドの有効性
issueのコメントにある通り、確かに『Contact Lens』のデータ連携が行われた。(Good!)
ただし、このモジュールのまま『Contact Trace Records』の設定をした所、Githubコミッターのコメントの通り、余計なレコードが作成された。(Bad!)
ワークアラウンドは、『Contact Trace Records』の連携は未設定だけど、『Contact Lens』のデータ連携をしたい。という時にしか適用できない。
AmazonConnect トラブルシュートシリーズ
AWSの相談・お困りごとありましたら、、、
AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。