注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Foundry を AWS S3 に接続して、S3 と Foundry 間でデータの読み取りと同期を行います。
| 機能 | ステータス |
|---|---|
| 探索 | 🟢 一般提供 |
| 一括インポート | 🟢 一般提供 |
| インクリメンタル(差分連携) | 🟢 サポートされるファイル形式で一般提供 |
| メディアセット | 🟢 一般提供 |
| 仮想テーブル | 🟢 一般提供 |
| ファイルエクスポート | 🟢 一般提供 |
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 バケットを対話的に探索するには、次の 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 の公式ドキュメント ↗ を参照してください。
Data Connection の Agent を使用して S3 に接続する場合、次の2つの方法でプロキシ設定を定義できます。
-Dhttps.proxyHost=example.proxy.com)を含めます。| パラメーター | 必須? | デフォルト | 説明 |
|---|---|---|---|
host | Y | HTTP プロキシホスト(スキームなし)。 | |
port | Y | HTTP プロキシのポート。 | |
protocol | N | HTTPS | 使用するプロトコル。HTTPS または HTTP。 |
nonProxyHosts | N | プロキシを使用しないホスト名(またはワイルドカードドメイン名)のリスト。例:`*.s3-external-1.amazonaws.com | |
credentials | N | プロキシで HTTP 基本認証が必要な場合(HTTP 407 レスポンス ↗ によって認証が要求される場合)、このブロックを含めます。 | |
credentials.username | N | HTTP プロキシの平文ユーザー名。 | |
credentials.password | N | HTTP プロキシの暗号化されたパスワード。 |
STS ロール設定により、S3 から読み取る際に AWS Security Token Service ↗ を使用してロールを引き受けることができます。
| パラメーター | 必須? | デフォルト | 説明 |
|---|---|---|---|
roleArn | Y | STS ロールの ARN 名。 | |
roleSessionName | Y | このロールを引き受ける際に使用するセッション名。 | |
roleSessionDuration | N | 3600秒 | セッションの継続時間。 |
externalId | N | ロールを引き受ける際に使用する外部 ID。 |
クラウド ID 認証により、Foundry は AWS インスタンス内のリソースにアクセスできます。クラウド ID は、Control Panel でエンロールメントレベルで設定および管理されます。クラウド ID を設定する方法を参照してください。

クラウド ID 認証を使用する場合、資格情報セクションにロール ARN が表示されます。資格情報の選択肢としてクラウド ID を選択した後、次の設定も行う必要があります。
このセクションでは、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 ワークフローについては、仮想テーブルのドキュメントを参照してください。
仮想テーブルを登録する際は、次のソース設定の要件に注意してください。
. が含まれる場合は、パス形式アクセスを有効にして、適切なエグレスポリシーを設定する必要があります。詳細については、上記の接続情報セクションを参照してください。
仮想テーブルを元にするパイプラインでインクリメンタル処理のサポートを有効にするには、ソースの Delta テーブルで Change Data Feed ↗ が有効になっていることを確認してください。Python トランスフォームの current および added 読み取りモードがサポートされています。Python トランスフォームでは、_change_type、_commit_version、_commit_timestamp 列が利用可能になります。
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 はソースの接続情報タブで設定できます。

インクリメンタル処理のサポートは、Iceberg のインクリメンタル読み取り ↗に依存しており、現在は APPEND のみです。Python トランスフォームの current および added 読み取りモードがサポートされています。
Parquet を使用する仮想テーブルは、スキーマ推論に依存します。スキーマの特定には、最大100個のファイルが使用されます。
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 公式ドキュメント ↗を参照してください。
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 のドキュメント ↗を参照してください。 |
エクスポートタスクはレガシー機能であり、新しい実装には推奨されません。新しいエクスポートではすべて、現在の推奨エクスポートワークフローを使用してください。このドキュメントは、レガシーのエクスポートタスクを引き続き使用しているユーザー向けに提供されています。
エクスポートタスクを使用して Foundry データセットから S3 バケットにファイルをエクスポートするには、ソースの種類が s3-direct である必要があります。タスクの種類は export-s3-task です。
Copied!1 2type: 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 4type: export-s3-task directoryPath: /exports/data incrementalType: incremental retriesPerFile: 2
カスタムバケットポリシーを使用した並列エクスポート:
Copied!1 2 3 4 5 6type: export-s3-task directoryPath: /exports/data useMultipart: false threads: 4 bucketPolicy: BucketOwnerFullControl setBucketPolicy: true
Spark の接頭辞を削除するためのパスの書き換え:
Copied!1 2 3 4type: export-s3-task directoryPath: /exports/data rewritePaths: "^spark/(.*)": "$1"
Python トランスフォームのコードリポジトリから 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)