AmazonConnect × Salesforce 連携をセットアップしてトラブルシュートした話 その２（Contact Lensのセットアップ）

![コンタクトチャネル分析_Qiita.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/671c8873-32c6-e903-c50d-46a4d2590501.jpeg)

# 前提条件
Saleforce API Version ： v55.0
serverlessrepo-AmazonConnectSalesforceLambda ： 5.19.0
この記事は、2022/10頃に書かれています。

serverlessrepo-AmazonConnectSalesforceLambda ： 5.19.0のバージョン固有で、githubのissue（後述）にもあがっているようなので、その内、VerUpで解消されると思われます。
同じハマり方をした人に届いたらいいな？と自分への備忘も兼ねて

モジュールの修正＆デプロイは自己責任でお願いします。

# トラブルの内容
公式のインストール手順書は下記の通り

https://amazon-connect.github.io/amazon-connect-salesforce-cti/docs/lightning/salesforce-lambdas/06-postcall-contact-lens-import/

この手順通りに設定してもデータ連携ができなかった。というのが、今回の記事の主旨になります。

初見の視点で手順書からは分かりにくい前提や、躓きやすい事を、備忘録として書き残しておきます。

# エラーの内容

Lambda：serverlessrepo-AmazonConnectS-sfProcessContactLens-xxxxxxxxxx  で、下記のエラーが発生します。

:::note warn
[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』の連携機能を有効にしている場合は作成されます。

https://amazon-connect.github.io/amazon-connect-salesforce-cti/docs/lightning/salesforce-lambdas/05-contact-trace-record-import

今回の検証の場合、『Contact Lens』だけの検証をしようとしており、『Contact Trace Records』の設定をしていなかった為に、Lambdaでエラーとなっていた。

# Githubのissueに登録があった

https://github.com/amazon-connect/amazon-connect-salesforce-cti/issues/144

リポジトリのコミッターが、
+ 『Comprehend / Transcribe』と『Contact Lens』の両方を有効にしている場合に、レコードが重複して作成されない為の措置である。
+ Lambdaの環境変数設定：TranscribeOutputS3BucketNameが未設定の場合はチェックをしないべきである。

とコメントしてますね。
将来は、『Contact Lens』のデータ連携が単独で有効できる修正がバージョンアップで入る（であろう）という事と理解した。

# ワークアラウンドとして、、、
『Contact Trace Records』を設定してしまえば、正常に挙動はするようだが、今回は、issueのコメントにあるモジュールの暫定修正の手順をメモを残しておく。

## 現行Lambdaのエクスポート（動作してるLambdaのダウンロード）

![Qiita_関数のエクスポート.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/9bda2b46-1305-609b-34d7-8fb778ea1c5e.jpeg)

![Qiita_関数のエクスポート＿確認.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/885f4248-bc6c-ad16-1e41-a8d287ec35f4.jpeg)

※　ダウンロードしたZipは、修正前バックアップを確保しておくこと

## コード編集(69行目、72行目、73行目、89行目のコメントアウト)
Zipを解凍したフォルダから『sfProcessContactLens.py』をエディタで開き、issueで指摘されていた行をコメントアウトする。

```diff_python
        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側の基本知識ですが、解凍した階層にファイルが直ぐに展開される必要があるので、下記のようなコマンドで圧縮すること。
圧縮ツールなどを利用する際には、どういう階層で圧縮されるか理解した上で設定して利用すること。

下記のように解凍して展開されたファイル全てを含めて圧縮し直す。

```shell
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のアップロード

![Qiita_関数のZip登録.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/fa011b8e-7d2e-74c8-47db-ebb17b673e7f.jpeg)

![Qiita_関数のZip登録_確認.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/5db47ad6-f8cb-6db0-4727-2c97d3f3bd45.jpeg)

## ワークアラウンドの有効性
issueのコメントにある通り、確かに『Contact Lens』のデータ連携が行われた。（Good！）
ただし、このモジュールのまま『Contact Trace Records』の設定をした所、Githubコミッターのコメントの通り、余計なレコードが作成された。（Bad！）

:::note 
ワークアラウンドは、『Contact Trace Records』の連携は未設定だけど、『Contact Lens』のデータ連携をしたい。という時にしか適用できない。
:::

# AmazonConnect トラブルシュートシリーズ

https://qiita.com/Syoji_Yonemoto/items/7e7a466bda0bc566527d

https://qiita.com/Syoji_Yonemoto/items/3d4a0cc018637d91848a

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/