外部保存ファイルの一括対応付けファイルの生成
Salesforce ファイルを Amazon S3 ロケーションに関連付けるマッピングファイルを生成することで、Amazon Bedrock または Amazon Kendra の既存のファイルを準備します。このタスクは、Amazon S3 に検索する既存のファイルがある場合にのみ実行する必要があります。
必要なエディション
| 必要なユーザー権限 | |
|---|---|
| 外部ストレージ検索を有効にする | 「アプリケーションのカスタマイズ」 |
| 権限セットを表示する | 「設定・定義を参照する」 |
| 権限セットを割り当てる | 「権限セットの割り当て」 |
| ローカル外部クライアントアプリケーションを作成する | 外部クライアントアプリケーションの作成、編集、削除 |
開始する前に、次のことを確認します。
- ContentHubAWSS3 タイプの Amazon S3 外部データソースを使用する Salesforce 組織。 「セマンティック検索の設定」を参照してください。
- Lambda 関数、IAM ロール、S3 バケットを作成する権限を持つ AWS アカウント。
- マッピングファイルを保存する Amazon S3 バケット。
Salesforce インテグレーションユーザーの作成
- Salesforce の [設定] から、インテグレーションユーザーを作成します。
-
次の値を使用してユーザーを設定します。
項目 値 ユーザーライセンス Salesforce インテグレーション プロファイル Minimum Access - API Only Integrations (最小アクセス - API 限定インテグレーション) - Salesforce API インテグレーション権限セットライセンスをユーザーに割り当てます。
-
次の権限を付与する権限セットを作成します。
- 「API の有効化」
- すべてのファイルのクエリ
- この権限セットをインテグレーションユーザーに割り当てます。
詳細は、Salesforce 開発者ドキュメントの「インテグレーションユーザー」および「権限セットの作成」を参照してください。
外部クライアントアプリケーションの作成
OAuth 2.0 クライアントログイン情報フローを使用するローカル外部クライアントアプリケーションを作成します。OAuth 設定で、[API を使用してユーザーデータを管理 (api)] 範囲を追加し、Salesforce インテグレーションユーザーを実行ユーザーとして設定します。
詳細は、「外部クライアントアプリケーションの作成とクライアントログイン情報フローの設定」を参照してください。
マッピングファイルの作成
外部に保存されているファイルを Salesforce に照会し、各 Salesforce ContentDocument ID とその Amazon S3 の場所の対応付けを生成する AWS Lambda 関数をリリースします。
環境変数を使用して関数を設定します。IAM 実行ロールを、指定された S3 バケットに対応付けファイルを書き込み、ログを Amazon CloudWatch に送信する権限を付与するs3:PutObjectに関連付けます。
手順については、AWSドキュメントの「Deploy Python Lambda functions, Using Lambda environment variables, Lambda execution role」を参照してください。
Lambda コードの参照を次に示します。
# 1. Authenticate to Salesforce (OAuth 2.0 Client Credentials)
token = sf_oauth_token(SF_INSTANCE_URL, SF_CLIENT_ID, SF_CLIENT_SECRET)
# 2. Query ContentVersion -> ContentDocumentId, ExternalDocumentInfo2, ExternalDataSource
soql = ("SELECT ContentDocumentId, ExternalDocumentInfo2, "
"ExternalDataSource.NamedCredentialId, ExternalDataSource.MasterLabel "
"FROM ContentVersion WHERE IsLatest=true AND ExternalDocumentInfo2!=null "
"AND ExternalDataSource.Type='ContentHubAWSS3'")
records = sf_query_all(token, soql)
# 3. Resolve each Named Credential's S3 endpoint URL (Tooling API)
nc_url = {nc_id: sf_named_credential_url(token, nc_id)
for nc_id in {r["ExternalDataSource"]["NamedCredentialId"] for r in records}}
# 4. Build the mapping keyed by the external document id
mapping = defaultdict(list)
for r in records:
nc_id = r["ExternalDataSource"]["NamedCredentialId"]
mapping[r["ExternalDocumentInfo2"]].append({
"ContentDocumentId": r["ContentDocumentId"],
"DataSourceLabel": r["ExternalDataSource"]["MasterLabel"],
"NamedCredentialId": nc_id,
"S3_Endpoint_URL": nc_url.get(nc_id),
})
# 5. Upload the mapping JSON to S3
boto3.client("s3").put_object(
Bucket=S3_BUCKET_NAME, Key=S3_FILE_NAME,
Body=json.dumps(mapping, indent=4), ContentType="application/json")