注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Foundryデータセット用のS3互換APIを使用すると、S3バケットとしてFoundryデータセットと対話することができます。APIを通じてデータセットがどのように動作するかを学び、セットアップガイドと例をご覧ください。
Foundryは、Amazon Simple Storage Service (S3) API (外部リンク)の一部を公開し、S3ストレージサービスと対話する方法を知っているクライアントを使用して、Foundryデータセットと対話することができます。例えば、AWS CLI、AWS SDKs、Hadoop S3ファイルシステム、Cyberduckなどです。
S3 APIは完全に実装されていないため、すべてのS3の概念がFoundryの概念に自然にマッピングされるわけではありません。例えば、バケット(Foundryデータセットを表す)の作成や削除は現在サポートされておらず、APIを使用する前にFoundryでデータセットを作成する必要があります。しかし、大部分のファイルの読み/書き/削除ワークフローはサポートされており、マルチパートアップロードも含まれます。サポートされているS3アクションのリストについては、サポートされているアクションをご覧ください。
このセクションでは、S3の概念がFoundryデータセットの概念にどのようにマッピングされるかを概説します。
S3バケットはFoundryデータセットに対応し、バケット名はFoundryデータセットの一意の識別子となります(例えば、ri.foundry.main.dataset.bafb7e96-84f1-4d23-a4a5-40b17c6912e7
)。
S3オブジェクトキーはFoundryデータセット内のファイルの論理パスに対応します(例えば、top-level-file.csv
やsubfolder/nested-file.csv
)。
APIは、英数字の名前(a-z
、A-Z
、0-9
のみを含む)を持つデータセットブランチに対応しています。ブランチを指定するには、ブランチ名をピリオドで区切ってデータセットのRIDに追加します:<dataset-rid>.<branch-name>
。ブランチが指定されていない場合、デフォルトのブランチが使用されます。
例えば、RIDがri.foundry.main.dataset.bafb7e96-84f1-4d23-a4a5-40b17c6912e7
のデータセットのmybranch
ブランチにアクセスするには、バケット名ri.foundry.main.dataset.bafb7e96-84f1-4d23-a4a5-40b17c6912e7.mybranch
を使用します。
APIはブランチの作成をサポートしていません。指定されたブランチはデータセット上に既に存在している必要があります。
S3にはトランザクションの概念がないため、Foundryデータセットトランザクションは以下の振る舞いで自動的に処理されます:
UPDATE
トランザクションを使用し、削除はDELETE
トランザクションを使用します。UPDATE
とDELETE
のトランザクションをアクティブにする必要があるからです。UPDATE
とDELETE
のトランザクションが直ちにコミットされます。これは、一般的にS3で期待される書き込み後の読み取りのセマンティクスを保持することを目指しています。ただし、開いているトランザクションへの書き込みリクエストがまだアクティブな状態で読み取りが試みられた場合、読み取りは最新のコミット済みビューから行われます。すべての書き込みや削除が完了した後にトランザクションがコミットすることを保証するために、新しい書き込みリクエストや削除リクエストの前に続けて読み取りリクエストを発行することができます。以上の振る舞いを考えると、書き込み後の読み取りのセマンティクスは保証されません。しかし、可能な限りそれらを提供するためにすべての努力がなされます。
APIを通じた接続は、アクセスキーIDとシークレットアクセスキーの資格情報を使用して認証されます。
静的資格情報は、標準的なAWSアクセスキーIDとシークレットアクセスキーの資格情報と同様です。静的資格情報は長寿命で、Foundryの場合は、Foundryのコントロールパネルで登録されたサードパーティアプリケーションのサービスユーザーに関連付けられています。以下のセットアップガイドで、これらの資格情報を生成するための/io/s3/api/v2/credentials
APIエンドポイントの使用方法について説明します。
静的なアクセスキーIDとシークレットアクセスキーを使用して、S3互換APIを介してデータセットに接続する場合、アクセスレベルは、サードパーティアプリケーションのサービスユーザーに付与されたアクセスによって決定されます。サードパーティアプリケーションのセットアップ時に以下のことを確認してください:
Viewer
ロールを持っているか、ファイルの書き込みや削除などの読み書きワークフローの場合はプロジェクトにEditor
ロールを持っていること。S3の資格情報は少なくとも1つのプロジェクトに制限されていることが必要です。新しい資格情報の生成時に、プロジェクトの制限が提供されます。
新しいV2エンドポイントの登録資格情報は、サードパーティアプリケーションのクライアントシークレットを必要としなくなりました。/io/s3/api/v2/credentials
エンドポイントのみを使用すべきです。以前に古いAPIを使用して登録した資格情報は、引き続き動作します。ただし、資格情報はもはやサードパーティアプリケーション上のプロジェクトの制限に紐付けられておらず、それらの制限の変更やクライアントシークレットのローテーションは、S3の資格情報を無効にしなくなりました。異なるプロジェクト制限を持つ資格情報が必要な場合は、V2エンドポイントで新しい資格情報セットを生成してください。
長寿命の資格情報が必要なワークフローや、サービスユーザーにアクセスを紐付けることが有益な場合は、静的資格情報の使用をお勧めします。通常のFoundryユーザーとしてAPIに認証することを好む場合は、ユーザー認証トークンを一時的なS3資格情報と交換することをサポートしています。このトークンは、サードパーティアプリケーションのOAuth2グラントの1つを通じても取得できます。
一時的な資格情報は、標準のAssumeRoleWithWebIdentity Security Token Service (STS) APIを使用して取得されます。私たちはWebIdentityToken
リクエストパラメーターが存在し、上記のように通常のFoundryトークンで設定されていることを必要とします。返される一時的な資格情報は、提供されたトークンと同じ範囲を持つことになります。資格情報の寿命を指定するためにDurationSeconds
パラメーターを提供することができます。資格情報は最大1時間の寿命を持ち、一時的な資格情報を取得するために使用されたFoundryトークンの寿命を超えることはありません。
STS APIはhttps://<FOUNDRY_URL>/io/s3
でアクセスできます。プログラム的にSTS資格情報を取得する場合は、このURLを標準のSTSクライアントや資格情報プロバイダーのエンドポイント設定に設定する必要があります。または、以下の例のように、curlや同等のツールを使用してAPIに直接アクセスすることもできます。<TOKEN>
は有効なFoundryトークンに置き換える必要があります。
Copied!1 2 3
# WebIdentityTokenを使用してAssumeRoleWithWebIdentityアクションを実行するためのcurlコマンド curl -X POST \ https://<FOUNDRY_URL>/io/s3?Action=AssumeRoleWithWebIdentity&WebIdentityToken=<トークン>
以下に示すように、XMLレスポンスでセッションの資格情報を受け取ります。これらの資格情報は、安全に保管する必要があります。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
<!-- XMLバージョンとエンコーディングを定義します --> <?xml version='1.0' encoding='UTF-8'?> <!-- AssumeRoleWithWebIdentityResponseという名前のエレメントを開始します --> <AssumeRoleWithWebIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/"> <!-- AssumeRoleWithWebIdentityResultという名前のエレメントを開始します --> <AssumeRoleWithWebIdentityResult> <!-- Credentialsという名前のエレメントを開始します --> <Credentials> <!-- AccessKeyIdという名前のエレメントを開始し、その値を定義します --> <AccessKeyId>PLTRLZZJE0...</AccessKeyId> <!-- SecretAccessKeyという名前のエレメントを開始し、その値を定義します --> <SecretAccessKey>2j3hKX4EDP...</SecretAccessKey> <!-- SessionTokenという名前のエレメントを開始し、その値を定義します --> <SessionToken>eyJwbG50ci...</SessionToken> <!-- Expirationという名前のエレメントを開始し、その値を定義します --> <Expiration>2023-08-30T10:55:08.841403951Z</Expiration> <!-- Credentialsエレメントを閉じます --> </Credentials> <!-- AssumeRoleWithWebIdentityResultエレメントを閉じます --> </AssumeRoleWithWebIdentityResult> <!-- AssumeRoleWithWebIdentityResponseエレメントを閉じます --> </AssumeRoleWithWebIdentityResponse>
一時的な資格情報を取得したら、以下のセットアップガイドのステップ4に進み、S3クライアントの設定方法について説明します。サードパーティのアプリケーションに関する手順はすべて無視してください。S3クライアントを設定する際には、セッショントークン、アクセスキーID、シークレットアクセスキーを提供する必要があります。
APIは、パススタイル (外部) バケットアクセスのみをサポートしています。バケットのURLは https://<FOUNDRY_URL>/io/s3/<bucket-name>/<key-name>
の形式となります。
Foundryの用語では、https://<FOUNDRY_URL>/io/s3/<dataset-rid>/<logical-filepath>
となります。
バーチャルホストスタイルバケットアクセス(バケット名がURLのサブドメインに含まれる)は現在サポートされていません。
putObject
操作に対して、署名付きURLがサポートされています。
以下の手順に従って、S3クライアントからAPIへの接続を設定します。
S3互換APIの資格情報を取得するためには、まずFoundryのコントロールパネルで作成されたサードパーティアプリケーションのクライアントIDとシークレットを取得する必要があります:
概念:認証を確認して、プロジェクト制限の要件と動作、生成された資格情報の範囲を理解します。
前のステップでサードパーティアプリケーションを作成したとき、Foundryは自動的にサービスユーザーを作成しました。S3 APIを通じてデータセットにアクセスするには、このサービスユーザーが関連するプロジェクトとマーキングに十分な権限を持っている必要があります。
サービスユーザーの権限を設定するには:
サービスユーザーにプロジェクトの権限を付与する際、S3 APIを通じて読み込みのみを行う場合はViewer
ロールを選択し、書き込みを行う場合はEditor
ロールを付与します。
資格情報を生成するには、コントロールパネルの組織でUser experience administrator
ロールが必要です。
以下のターミナルコマンドを実行すると(curlまたはPowershellを使用)、アクセスキーIDとシークレットアクセスキーが表示されます。<TOKEN>
をユーザーアカウントのアクティブなトークンに、<CLIENT_ID>
を前のステップで生成したサードパーティアプリケーションのクライアントIDに置き換えます。さらに、<PROJECT_RID>
を資格情報がアクセス可能なプロジェクトのRIDに置き換える必要があります。projectRestrictions
の値は複数のプロジェクトを取ることができ、必要に応じてさらにプロジェクトRIDをリストに追加できます。
Copied!1 2 3 4 5 6 7 8
# 以下のコマンドは、新しいクレデンシャルを作成するためのものです。 # curlを使用してPOSTリクエストを送信します。 curl -X POST \ # POSTリクエストを指定します。 -H "Authorization: Bearer <TOKEN>" \ # トークンを用いた認証情報をヘッダーに含めます。 -H "Content-type: application/json" \ # データ形式としてJSONを指定します。 --data '{"clientId":"<CLIENT_ID>","projectRestrictions":["<PROJECT_RID>"]}' \ # 送信するデータを指定します。ここではclientIdとprojectRestrictionsを指定しています。 https://<FOUNDRY_URL>/io/s3/api/v2/credentials # 送信先のURLを指定します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13
# 認証用とデータ形式指定用のヘッダーを定義します $headers = @{ "Authorization" = "Bearer <TOKEN>" # 認証トークン "Content-type" = "application/json" # データ形式はJSON } # POSTリクエストのボディを定義します $body = @{ "clientId" = "<CLIENT_ID>" # クライアントID "projectRestrictions" = @("<PROJECT_RID>") # プロジェクトID } | ConvertTo-Json # JSON形式に変換します # Invoke-WebRequestを用いてPOSTリクエストを送ります Invoke-WebRequest -Uri "https://<FOUNDRY_URL>/io/s3/api/v2/credentials" -Method POST -Headers $headers -Body $body
このリクエストの応答で受け取ったアクセスキーとシークレットキーを安全に保管してください。これらの資格情報をクライアントに設定する必要があります。第三者アプリケーションのクライアントIDとシークレットではありません。
デフォルトでは、/v2/資格情報
エンドポイントは認証ユーザーが自身の Organization 内の第三者アプリケーションの資格情報を生成していると想定しています。第三者アプリケーションが別の組織に存在する場合は、URLのクエリパラメーターとして組織IDを指定します:https://<FOUNDRY_URL>/io/s3/api/v2/資格情報?organizationRid=<ORGANIZATION_ID>
。
アクセスキーとシークレットアクセスキーを取り消す必要がある場合は、以下のエンドポイントを呼び出し、<ACCESS_KEY_ID>
を取り消したいアクセスキーIDに置き換えます:
Copied!1 2 3 4 5 6
# curlコマンドを使用してDELETEリクエストを送信します # AuthorizationヘッダにはBearerトークンを含めます # このコマンドは、特定のアクセスキーIDを持つ認証情報を削除するためのものです curl -X DELETE \ -H "Authorization: Bearer <TOKEN>" \ https://<FOUNDRY_URL>/io/s3/api/v2/credentials/<ACCESS_KEY_ID>
S3 クライアントを設定するには、以下の設定パラメーターを設定する必要があります。これらが一般的な S3 クライアントでどのように設定されるべきかの詳細は、以下の 例 を参照してください。
名前 | 値 | 説明 |
---|---|---|
ホスト名 / エンドポイント | https://<FOUNDRY_URL>/io/s3 | クライアントが接続すべきホスト名(AWS でホストされているネイティブ S3 バケットの場合は s3.amazonaws.com )。 |
リージョン | foundry | リージョンは、V4署名検証 プロセスの一部として使用されるため、foundry に設定する必要があります。クライアントが標準の AWS リージョンのみを使用できる場合は、us-east-1 を使用してください。 |
資格情報 | アクセスキー ID とシークレットアクセスキー、およびオプションでセッショントークン | 上記で説明したように生成された 静的 または 一時的な 資格情報。 |
パススタイルアクセス | true | API は パススタイル バケットアクセスのみをサポートし、バーチャルホストスタイルのバケットアクセスはサポートしていません。 |
バケット名(オプション) | ri.foundry.main.dataset.<uuid> | 各 Foundry データセットは別々の S3 バケットとしてアクセス可能で、バケット名はデータセットの RID となります。 |
次の S3 操作(外部)がサポートされています:
上述したように、クライアント/SDK/コネクタはパススタイルのバケットアクセスを使用するように設定する必要があります。クライアントがパススタイルのバケットアクセスをサポートしていない場合、現在この API との互換性はありません。
例えば、S3A Hadoop クライアント(外部)では、fs.s3a.path.style.access
フラグを使用して設定できます。
一時的な資格情報 を使用している場合は、AWS セッションアクセストークンも設定してください。詳細については、関連する AWS クライアントのドキュメンテーションを参照してください。例えば、AWS CLI(外部)を使用している場合は、AWS_SESSION_TOKEN
環境変数を設定してください。
アクセスキー ID とシークレットアクセスキーがあれば、AWS CLI を設定する準備が整いました。以下のコマンドを実行し、アクセスキー ID、シークレットアクセスキー、およびリージョンを入力します。
$ aws configure --profile foundry
AWS Access Key ID [None]: <ACCESS_KEY_ID> # AWSアクセスキーIDを入力してください
AWS Secret Access Key [None]: <SECRET_ACCESS_KEY> # AWSシークレットアクセスキーを入力してください
Default region name [None]: foundry # デフォルトのリージョン名を入力してください
Default output format [None]: # デフォルトの出力フォーマットを入力してください(必要に応じて)
これで、foundry
プロファイルのコマンドを実行できるようになりました。例えば:
Copied!1 2
# AWS コマンドラインインターフェースを使用して、Foundry の特定のエンドポイントとデータセットにアクセスします。 aws --profile foundry --endpoint-url https://<FOUNDRY_URL>/io/s3 s3 ls s3://<DATASET_RID>
最近のリリース (外部) で AWS CLI が更新され、profile
設定の一部として endpoint-url
を設定できるようになりました。以下に示すのは、~/.aws/config
に設定されている foundry
プロファイルの例です。endpoint_url
プロパティを使用してプロファイルを設定する場合、aws
コマンドを使用する際に --endpoint-url
引数を含める必要はなくなります。代わりに、--profile
だけで十分です。
Copied!1 2 3 4 5 6
[profile foundry] region = foundry endpoint_url = https://<FOUNDRY_URL>/io/s3 # プロファイル名: foundry # リージョン: foundry # エンドポイントURL: https://<FOUNDRY_URL>/io/s3 (FOUNDRY_URLは実際のURLに置き換えてください)
AWS CLIで一時的な資格情報を使用するには、AWS STSのAssumeRoleWithWebIdentity
呼び出しをCLIで設定する方法を説明している(外部)AWSのドキュメンテーションに従ってください。以下に示すのは、~/.aws/config
で設定されるfoundry
プロファイルのサンプルです。この設定を使用すると、環境変数(AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
、AWS_SESSION_TOKEN
)や~/.aws/credentials
に資格情報を設定する必要はありません。
Copied!1 2 3 4 5
[profile foundry] region = foundry # リージョンを指定します。ここでは "foundry" と指定しています。 endpoint_url = https://<FOUNDRY_URL>/io/s3 # エンドポイントのURLを指定します。"<FOUNDRY_URL>"は適切なURLに置き換えてください。 web_identity_token_file = ~/.foundry/web-identity.token # Web IDのトークンファイルの場所を指定します。 role_arn=xxxxxxxxxxxxxxxxxxxx # ロールのARN (Amazon Resource Name) を指定します。"xxxxxxxxxxxxxxxxxxxx"は適切なARNに置き換えてください。
上記の例では、有効な Foundry トークンが ~/.foundry/web-identity.token
のファイルに格納されていることを前提としています。このファイルが適切にセキュアで、リークのリスクがない場合にのみ、このアプローチをお勧めします。role_arn
プロパティは使用されませんが、AWS CLI のバリデーションのために提供し、少なくとも 20 文字以上である必要があります。例では、xxxxxxxxxxxxxxxxxxxx
をプレースホルダーとして使用しています。この設定を使用するには、上記で説明したように --endpoint-url
を使用するのではなく、~/.aws/config
で endpoint_url
を設定する必要があります。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
import boto3 import pandas as pd # boto3 クライアントを作成 s3 = boto3.client( 's3', aws_access_key_id="<ACCESS_KEY_ID>", aws_secret_access_key="<SECRET_ACCESS_KEY>", # session_token="<SESSION_TOKEN>", 一時的な認証情報を使用する場合のみ必要 endpoint_url="https://<FOUNDRY_URL>/io/s3", region_name="foundry" ) # S3 バケットとオブジェクトのキーを設定 bucket = 'ri.foundry.main.dataset.<uuid>' key = 'iris.csv' # オブジェクトを取得して、pandas のデータフレームに読み込む obj = s3.get_object(Bucket=bucket, Key=key) df = pd.read_csv(obj['Body']) # データフレームを出力 print(df)
Boto3 のドキュメントの S3 セクション (外部)を参照して、Boto3 を使用して 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
from pyspark.sql import SparkSession hostname = "https://<subdomain>.palantircloud.com/io/s3" access_key_id = "<ACCESS_KEY_ID>" secret_access_key = "<SECRET_ACCESS_KEY>" # データセットRIDが有効なホスト名として解析できることを確認 dataset_rid = "ri.foundry.main.dataset.<uuid>".replace('.', '-') # SparkSessionの作成 spark_session = ( SparkSession.builder .config("fs.s3a.access.key", access_key_id) # アクセスキーIDの設定 .config("fs.s3a.secret.key", secret_access_key) # シークレットアクセスキーの設定 # .config("fs.s3a.session.token", session_token) 一時的な認証情報を使用する場合に必要 .config("fs.s3a.endpoint", hostname) # エンドポイントの設定 .config("fs.s3a.endpoint.region", "foundry") # エンドポイントのリージョンの設定 .config("fs.s3a.path.style.access", "true") # パススタイルアクセスの設定 .getOrCreate() # SparkSessionの取得または作成 ) # parquetファイルの読み込み df = spark_session.read.parquet(f"s3a://{dataset_rid}/") df.show() # データフレームの表示
詳細については、Spark のドキュメンテーション を参照し、Spark を S3 と一緒に使用する方法をご覧ください。
バケット名に '.' が含まれていると、Hadoop AWS クライアントを使用する際に問題が発生することがあります。"bucket is null/empty" というエラーメッセージが表示される場合があります。これが発生すると、データセットの RID は有効なホスト名として解析できません。回避策として、データセット RID の '.' を '-' に置き換えることができます。
次のプロファイルをダウンロードします: Foundry S3.cyberduckprofile
プロファイルファイルをダブルクリックして開き、Cyberduck にプロファイルを登録します。
Cyberduck がユーザーのために作成したデフォルトのブックマークに次の接続プロパティを設定します:
https://<subdomain>.palantircloud.com
<ACCESS_KEY_ID>
<SECRET_ACCESS_KEY>
ri.foundry.main.dataset.<uuid>
ブックマークの設定ウィンドウを閉じます。
ブックマークをダブルクリックして接続を開きます。
S3 互換のソースに接続する方法についての詳細は、Cyberduck のドキュメンテーション (外部) を参照してください。
Google Cloud の Storage Transfer Service (外部) は、Foundry を S3 互換ソース (外部) として扱うことができます。以下の手順に従って、Foundry のデータセットから Cloud Storage バケットにデータを転送できます。
Google Cloud の指示に従って、エージェントプールと転送エージェントを設定します。
転送ジョブを作成し、ソースタイプ として S3 互換のオブジェクトストレージ を選択します。次に、ステップ (1) で作成したエージェントプールを選択し、以下の設定が適用されていることを確認します:
ri.foundry.main.dataset.<uuid>
.https://<FOUNDRY_URL>/io/s3
foundry
HTTPS
ListObjectsV2
転送ジョブの Cloud Storage バケットの宛先、スケジュール、設定の設定を完成させます。Apache NiFi を使用して、Foundry データセット内のファイルを読み書きすることができます。以下の例は、PutS3Object
プロセッサータイプを書き込み用に設定する方法を示しています:
path/to/file.csv
ri.foundry.main.dataset.<uuid>
<ACCESS_KEY_ID>
<SECRET_ACCESS_KEY>
us-east-1
に対応しますtrue
https://<FOUNDRY_URL>/io/s3
PutS3Object
プロセッサーや他の S3 互換ソースをサポートするプロセッサーについての詳細は、Apache NiFi のドキュメンテーション (外部) を参照してください。
Airbyte (外部) の S3 デスティネーションに対するサポートは、Foundry データセットにファイルを書き込むために使用できます。以下のデスティネーション設定を設定します:
<ACCESS_KEY_ID>
<SECRET_ACCESS_KEY>
ri.foundry.main.dataset.<uuid>
us-east-1
https://<FOUNDRY_URL>/io/s3
詳細と設定オプションについては、Airbyte の S3 デスティネーション (外部) のドキュメンテーションを参照してください。