データ接続と統合利用可能なコネクターAmazon S3

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

Amazon S3

Foundry を AWS S3 に接続して、S3 と Foundry 間でデータの読み取りと同期を行います。

サポートされる機能

機能ステータス
探索🟢 一般提供
一括インポート🟢 一般提供
インクリメンタル(差分連携)🟢 サポートされるファイル形式で一般提供
メディアセット🟢 一般提供
仮想テーブル🟢 一般提供
ファイルエクスポート🟢 一般提供

セットアップ

  1. Data Connection アプリケーションを開き、画面右上の + 新規ソースを選択します。
  2. 利用可能なコネクターの種類から S3 を選択します。
  3. 以下のセクションの情報を使用し、表示される追加設定のプロンプトに従って、コネクターのセットアップを続けます。

Foundry でのコネクターのセットアップについて詳しくはこちら。

接続情報

オプション必須かどうか説明
URLはいS3 バケットの URL です。Data Connection は s3a プロトコルをサポートしています。末尾のスラッシュを含める必要があります。詳細については、AWS の公式ドキュメント ↗ を参照してください。
例: s3://bucket-name/
エンドポイントはいS3 へのアクセスに使用するエンドポイントです。
例: s3.amazonaws.com または s3.us-east-1.amazonaws.com
リージョンいいえAWS サービスの設定時に使用する AWS リージョンです。STS ロールを使用する場合は必須です。警告:リージョンを含む S3 エンドポイントとともにリージョンを指定すると、失敗する場合があります。
例: us-east-1 または eu-central-1
ネットワーク接続はいステップ1:Foundry エグレスポリシー
Foundry から S3 へのエグレスを許可するために、Foundry のエグレスポリシーをバケットにアタッチします。Data Connection アプリケーションは、指定された接続情報に基づいて適切なエグレスポリシーを提案します。
例: bucket-name.s3.us-east-1.amazonaws.com (Port 443)

ステップ2:AWS バケットポリシー
さらに、S3 からのアクセスのために、該当する Foundry の IP および/またはバケットの情報を許可リストに登録する必要があります。Foundry の IP 情報は、Control Panel アプリケーションのネットワークのエグレスで確認できます。S3 でのバケットポリシーの設定方法の詳細については、AWS の公式ドキュメント ↗ を参照してください。

注:Foundry エンロールメントと同じリージョンでホストされている S3 バケットへのアクセスをセットアップするには、追加の設定が必要です。これらの要件の詳細については、ネットワークエグレスのドキュメントを参照してください。
クライアント証明書と秘密鍵いいえ接続を保護するためにクライアント証明書と秘密鍵が必要かどうかは、ソースによって異なります。
サーバー証明書いいえ接続を保護するためにサーバー証明書が必要かどうかは、ソースによって異なります。
資格情報はいオプション1:アクセスキーとシークレット
S3 への接続に使用するアクセスキーIDとシークレットを入力します。
AWS アカウントで Foundry 用の新しい IAM ユーザーを作成し、その IAM ユーザーに S3 バケットへのアクセスを許可することで、資格情報を生成できます。

オプション2: OpenID Connect (OIDC)
表示されるソースシステムの設定手順に従って、OIDC をセットアップします。OpenID Connect の詳細については AWS の公式ドキュメント ↗ を、Foundry での OIDC の動作についてはドキュメントを参照してください。

AWS IAM ユーザーの作成の詳細については、AWS の公式ドキュメント ↗ を参照してください。Foundry がユーザーに求める AWS 権限の詳細については、S3 の権限に関するドキュメントを確認してください。
STS ロールいいえS3 コネクターは、S3 への接続時に任意で Security Token Service (STS) ロール ↗ を引き受けることができます。詳細については、STS ロールの設定を参照してください。
接続タイムアウトいいえ最初に接続を確立する際に、接続を断念してタイムアウトするまで待機する時間(ミリ秒)です。
デフォルト: 50000
ソケットタイムアウトいいえ確立済みの開いている接続で、データが転送されるのを待機する時間(ミリ秒)です。この時間が経過すると接続はタイムアウトし、閉じられます。
デフォルト: 50000
最大接続数いいえ許可される、開いている HTTP 接続の最大数です。
デフォルト: 50
エラー時の最大再試行回数いいえ失敗した再試行可能なリクエスト(例:サービスからの 5xx エラーレスポンス)の再試行の最大回数です。
デフォルト: 3
クライアント KMS キーいいえAWS SDK によるクライアント側のデータ暗号化に使用する KMS キー名またはエイリアスです。PCloud の Agent でこのオプションを使用するには、プロキシの変更が必要です。
クライアント KMS リージョンいいえKMS クライアントに使用する AWS リージョンです。AWS KMS キーが指定されている場合にのみ関係します。
サブフォルダーを完全一致させるいいえ任意で、サブフォルダーに指定したパスを S3 のサブフォルダーと完全一致させます。false に設定した場合、サブフォルダーの設定が foo/bar/ であれば、s3://bucket-name/foo/bar/ と s3://bucket-name/foo/bar_baz/ の両方が一致します。
プロキシ設定はい - Agent ベースの接続のみS3 のプロキシ設定を行います。
注:この設定は、(a)Foundry エンロールメントが AWS でホストされている、(b)Foundry エンロールメントとは異なる AWS リージョンでホストされている S3 バケットに接続する、(c)Data Connection の Agent を介して接続する、という条件をすべて満たす場合に必須です。詳細については、S3 のプロキシ設定を参照してください。
パス形式アクセスを有効にするいいえ仮想ホスト形式のアクセス URL(例: https://bucket-name.s3.region-code.amazonaws.com/key-name)の代わりに、パス形式アクセスの URL(例: https://s3.region-code.amazonaws.com/bucket-name/key-name)を使用します。詳細については、AWS の公式ドキュメント ↗ を参照してください。
カタログいいえこの S3 バケットに保存されているテーブルのカタログを設定します。詳細については、仮想テーブルを参照してください。

S3 に必要な読み取りと同期の権限

S3 バケットを対話的に探索するには、次の AWS 権限が必要です。

Copied!
1 2 3 4 5 { "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::path/to/bucket"], "Effect": "Allow", }

S3 からのバッチ同期、仮想テーブル、メディア同期には、次の AWS 権限が必要です。

Copied!
1 2 3 4 5 { "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3:::path/to/bucket/*"], "Effect": "Allow", }

S3 でのバケットポリシーの設定方法の詳細については、Amazon S3 のポリシーと権限に関する AWS の公式ドキュメント ↗ を参照してください。

S3 プロキシ設定(Agent ベースの接続)

Data Connection の Agent を使用して S3 に接続する場合、次の2つの方法でプロキシ設定を定義できます。

  • ソース設定:以下のテーブルに示すとおり、ソース設定で各プロキシ設定を直接定義します。
  • Agent のシステムプロパティ:フォールバックとして、Agent のシステムプロパティでプロキシ設定を行えます。そのためには、Agent の詳細設定に適切な JVM 引数(たとえば -Dhttps.proxyHost=example.proxy.com)を含めます。
パラメーター必須?デフォルト説明
hostYHTTP プロキシホスト(スキームなし)。
portYHTTP プロキシのポート。
protocolNHTTPS使用するプロトコル。HTTPS または HTTP。
nonProxyHostsNプロキシを使用しないホスト名(またはワイルドカードドメイン名)のリスト。例:`*.s3-external-1.amazonaws.com
credentialsNプロキシで HTTP 基本認証が必要な場合(HTTP 407 レスポンス ↗ によって認証が要求される場合)、このブロックを含めます。
credentials.usernameNHTTP プロキシの平文ユーザー名。
credentials.passwordNHTTP プロキシの暗号化されたパスワード。

STS ロール設定

STS ロール設定により、S3 から読み取る際に AWS Security Token Service ↗ を使用してロールを引き受けることができます。

パラメーター必須?デフォルト説明
roleArnYSTS ロールの ARN 名。
roleSessionNameYこのロールを引き受ける際に使用するセッション名。
roleSessionDurationN3600秒セッションの継続時間。
externalIdNロールを引き受ける際に使用する外部 ID。

クラウド ID 設定

クラウド ID 認証により、Foundry は AWS インスタンス内のリソースにアクセスできます。クラウド ID は、Control Panel でエンロールメントレベルで設定および管理されます。クラウド ID を設定する方法を参照してください。

クラウド ID を使用する S3 ソース

クラウド ID 認証を使用する場合、資格情報セクションにロール ARN が表示されます。資格情報の選択肢としてクラウド ID を選択した後、次の設定も行う必要があります。

  1. 対象の Amazon AWS アカウントで Identity and Access Management (IAM) ロールを設定します。
  2. 接続する S3 バケットへのアクセス権を IAM ロールに付与します。通常はバケットポリシー ↗を使用して行えます。
  3. S3 ソースの設定詳細で、Security Token Service (STS) ロール ↗設定に IAM ロールを追加します。Foundry のクラウド ID の IAM ロールは、S3 にアクセスする際に AWS アカウントの IAM ロール ↗を引き受けようとします。
  4. クラウド ID の IAM ロールが対象の AWS アカウントの IAM ロールを引き受けられるように、対応する信頼ポリシーを設定します ↗。

仮想テーブル

このセクションでは、S3 ソースの仮想テーブルの使用に関する補足情報を説明します。Foundry データセットへの同期には、このセクションは適用されません。

次のテーブルに、S3 でサポートされている仮想テーブルの機能を示します。

機能ステータス
一括登録🔴 利用不可
自動登録🔴 利用不可
テーブル入力🟢 一般提供:Code Repositories、Pipeline Builder での Avro ↗、Delta ↗、Iceberg ↗、Parquet ↗
テーブル出力🟢 一般提供:Code Repositories、Pipeline Builder での Avro ↗、Delta ↗、Iceberg ↗、Parquet ↗
インクリメンタル(差分処理)パイプライン🟢 Delta テーブルで一般提供:APPEND のみ(詳細)
🟢 Iceberg テーブルで一般提供:APPEND のみ(詳細)
🔴 Parquet テーブルでは利用不可
計算のプッシュダウン🔴 利用不可

S3 に保存されたテーブルを入力または出力として使用できる、サポート対象の Foundry ワークフローについては、仮想テーブルのドキュメントを参照してください。

ソース設定の要件

仮想テーブルを登録する際は、次のソース設定の要件に注意してください。

  • Foundry ワーカーのソースを使用する必要があります。仮想テーブルでは、Agent ワーカー接続の使用はサポートされていません。
  • 接続情報のネットワーク接続セクションの説明に従って、双方向接続と許可リスト登録が確立されていることを確認してください。
  • Code Repositories で仮想テーブルを使用する場合、追加で必要なソース設定の詳細については、仮想テーブルのドキュメントを参照してください。
  • バケットに . が含まれる場合は、パス形式アクセスを有効にして、適切なエグレスポリシーを設定する必要があります。

詳細については、上記の接続情報セクションを参照してください。

Delta

仮想テーブルを元にするパイプラインでインクリメンタル処理のサポートを有効にするには、ソースの Delta テーブルで Change Data Feed ↗ が有効になっていることを確認してください。Python トランスフォームの current および added 読み取りモードがサポートされています。Python トランスフォームでは、_change_type、_commit_version、_commit_timestamp 列が利用可能になります。

Iceberg

Apache Iceberg テーブルを元にする仮想テーブルを読み込むには、Iceberg カタログが必要です。Iceberg カタログの詳細については、Apache Iceberg のドキュメント ↗を参照してください。ソースに登録されるすべての Iceberg テーブルは、同じ Iceberg カタログを使用する必要があります。

デフォルトでは、S3 内の Iceberg メタデータファイルを使用してテーブルが作成されます。テーブルを登録する際は、これらのメタデータファイルの場所を示す warehousePath を指定する必要があります。

テーブルが S3 に保存されている場合、AWS Glue ↗ を Iceberg カタログとして使用できます。この統合の詳細については、AWS Glue のドキュメント ↗を参照してください。ソースに設定された資格情報には、AWS Glue データカタログへのアクセス権が必要です。AWS Glue は、ソースの接続情報タブで設定できます。このソースに登録されたすべての Iceberg テーブルは、自動的に AWS Glue をカタログとして使用します。テーブルは database_name.table_name という命名パターンで登録してください。

Databricks で Delta Universal Format (UniForm) を使用する場合、Unity Catalog ↗ を Iceberg カタログとして使用できます。この統合の詳細については、Databricks のドキュメント ↗を参照してください。AWS Glue と同様に、カタログはソースの接続情報タブで設定できます。Unity Catalog に接続するには、エンドポイントと個人用アクセストークンを指定する必要があります。テーブルは catalog_name.schema_name.table_name という命名パターンで登録してください。

Polaris ↗ は、S3 に保存されたテーブルの Iceberg カタログとして使用できます。ほかのカタログと同様に、Polaris はソースの接続情報タブで設定できます。

仮想テーブルの S3 カタログ

インクリメンタル処理のサポートは、Iceberg のインクリメンタル読み取り ↗に依存しており、現在は APPEND のみです。Python トランスフォームの current および added 読み取りモードがサポートされています。

Parquet

Parquet を使用する仮想テーブルは、スキーマ推論に依存します。スキーマの特定には、最大100個のファイルが使用されます。

データを S3 にエクスポートする

S3 にエクスポートするには、まず S3 コネクターのエクスポートを有効にします。次に、新しいエクスポートを作成します。

S3 へのエクスポートに必要な権限

データを S3 にエクスポートするには、次の AWS 権限が必要です。

Copied!
1 2 3 4 5 { "Action": ["s3:PutObject"], "Resource": ["arn:aws:s3:::path/to/bucket/*"], "Effect": "Allow", }

S3 のバケットポリシーを設定する方法の詳細については、Amazon S3 のポリシーとアクセス許可に関する AWS 公式ドキュメント ↗を参照してください。

Iceberg BYOB ストレージに必要な権限

S3 バケットを Foundry Iceberg テーブルの bring-your-own-bucket (BYOB) ストレージの場所として使用する場合、S3 バケットと、その暗号化に使用する KMS キーに対して、次の AWS 権限が必要です。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 { "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ], "Effect": "Allow" }

さらに、次の KMS 権限が必要です。

Copied!
1 2 3 4 5 6 7 8 9 { "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey" ], "Resource": ["arn:aws:kms:region:account-id:key/key-id"], "Effect": "Allow" }

資格情報の払い出しには、sts:GetFederationToken 権限も必要です。セットアップ手順の全容については、BYOB ストレージのドキュメントを参照してください。

エクスポート設定のオプション

オプション必須?デフォルト説明
パス接頭辞いいえ該当なしエクスポートされるファイルに使用するパス接頭辞です。エクスポートされるファイルのフルパスは、s3://<bucket-name>/<path-in-source-config>/<path-prefix>/<exported-file> として計算されます。
Canned ACLいいえ該当なしCanned ACL のいずれかを使用して、アップロードされたファイルに付与する AWS アクセス制御リスト (ACL) を設定します。各 ACL の説明については、AWS のドキュメント ↗を参照してください。

エクスポートタスク(レガシー)

エクスポートタスクはレガシー機能であり、新しい実装には推奨されません。新しいエクスポートではすべて、現在の推奨エクスポートワークフローを使用してください。このドキュメントは、レガシーのエクスポートタスクを引き続き使用しているユーザー向けに提供されています。

S3 エクスポートタスクの設定

エクスポートタスクを使用して Foundry データセットから S3 バケットにファイルをエクスポートするには、ソースの種類が s3-direct である必要があります。タスクの種類は export-s3-task です。

基本設定

Copied!
1 2 type: export-s3-task directoryPath: /some/directory

詳細設定オプション

オプション必須デフォルト説明
directoryPathはい該当なしファイルのエクスポート先となる S3 パス
retriesPerFileいいえ0ファイルエクスポートごとの再試行回数
setBucketPolicyいいえtrueエクスポートしたファイルにバケットポリシーを適用するかどうか
bucketPolicyいいえ該当なし適用する特定のバケットポリシー(たとえば、BucketOwnerFullControl)。AWS CannedAccessControlList ↗ を参照
incrementalTypeいいえsnapshotインクリメンタル(差分)エクスポートには incremental を使用
useMultipartいいえfalse並列エクスポートを有効にする
threadsいいえ1並列でエクスポートするオブジェクトの数
rewritePathsいいえ該当なしパスの書き換え用の正規表現パターンのマップ

設定例

再試行を伴うインクリメンタルエクスポート:

Copied!
1 2 3 4 type: export-s3-task directoryPath: /exports/data incrementalType: incremental retriesPerFile: 2

カスタムバケットポリシーを使用した並列エクスポート:

Copied!
1 2 3 4 5 6 type: export-s3-task directoryPath: /exports/data useMultipart: false threads: 4 bucketPolicy: BucketOwnerFullControl setBucketPolicy: true

Spark の接頭辞を削除するためのパスの書き換え:

Copied!
1 2 3 4 type: export-s3-task directoryPath: /exports/data rewritePaths: "^spark/(.*)": "$1"

コードで S3 ソースを使用する

Python トランスフォームのコードリポジトリから S3 バケットに接続して、データセットをエクスポートしたり、外部トランスフォームを使用してファイルを処理したりできます。

S3 バケットにファイルを書き込む

以下の例では、トランスフォームジェネレーターを使用して、データセット RID の集合を S3 バケットにエクスポートする方法を示します。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 # この例では、AWS セッション資格情報を使用して、データセットのリストを S3 バケットにエクスポートする方法を示します。 # エクスポートしたデータセットごとに、データセットの RID、エクスポートのタイムスタンプ、エクスポートした # ファイル数、および S3 の宛先パスを含む出力ログが生成されます。 from pyspark.sql import functions as F, types as T from transforms.api import Input, Output, transform, Transform from transforms.external.systems import external_systems, Source from typing import List from datetime import datetime import boto3 import logging log = logging.getLogger(__name__) S3_BUCKET_REGION = "<region>" S3_BUCKET_NAME = "<name>" S3_ENDPOINT_URL = "<endpoint_url>" S3_DEST_PATH = "<s3_dest_path>" S3_SOURCE_RID = "<s3_source_rid>" LOG_OUTPUT_PATH = "<log_output_path>" DATASET_RID = "<dataset_rid>" @external_systems( s3_source=Source(S3_SOURCE_RID) ) @transform( export_log=Output(f"{LOG_OUTPUT_PATH}/export_{DATASET_RID}_log"), input_dataset=Input(f"{DATASET_RID}") ) def compute_function(ctx, input_dataset, s3_source, export_log): # 1. S3 バケットの資格情報を取得する refreshable_creds = s3_source.get_session_credentials() creds = refreshable_creds.get() # 2. 現在のデータセットの S3 キーを構築する s3_dataset_key = f"{S3_DEST_PATH}/{DATASET_RID}/" # 3. boto3 クライアントをセットアップする # 注:資格情報の TTL(約1時間)を超える可能性がある大規模なエクスポートでは、 # 資格情報を定期的に更新するか、 # boto3 の RefreshableCredentials パターンを実装することを検討してください。 s3_client = boto3.client( "s3", aws_access_key_id=creds.access_key_id, aws_secret_access_key=creds.secret_access_key, region_name=S3_BUCKET_REGION, endpoint_url=S3_ENDPOINT_URL, ) # データセットのファイルを S3 に書き込むヘルパー関数 def write_file(row): try: with input_dataset.filesystem().open(row.path, "rb") as in_f: s3_key = s3_dataset_key + row.path s3_client.upload_fileobj(in_f, S3_BUCKET_NAME, s3_key) except Exception as e: log.error(f"Exception when uploading {DATASET_RID} to S3: {e}") raise # 4. データセットのファイルを S3 に書き込む result = input_dataset.filesystem().files() result.foreach(write_file) # 5. 出力するエクスポートログのスキーマを定義する schema = T.StructType([ T.StructField("dataset_rid", T.StringType(), False), T.StructField("export_timestamp", T.TimestampType(), False), T.StructField("files_uploaded", T.IntegerType(), False), T.StructField("s3_dest_path", T.StringType(), False) ]) file_count = result.count() output_df = ctx.spark_session.createDataFrame([(DATASET_RID, datetime.now(), file_count, s3_dataset_key)], schema) export_log.write_dataframe(output_df)