# Amazon S3 Import Integration V2 Amazon S3向けインポートデータコネクタにより、S3バケットに保存されているJSON、TSV、CSVファイルからデータをインポートすることができます。Amazon S3 Import Integration v2とv1の主な違いとメリットは、*assume_role*認証のサポートが追加されたことです。 ## Amazon S3 Import Integration v2とv1の認証方式について 以下の表の情報を確認して、v2とv1の認証の違いを理解してください。v1の詳細については、[Amazon S3 Import Integration v1](https://docs.treasuredata.com/display/INT/Amazon+S3+Import+Integration+v1)を参照してください。 | 認証方式 | Amazon S3 v2 | Amazon S3 v1 | | --- | --- | --- | | **basic** | **x** | **x** | | **anonymous** | | **x** | | **session** | **x** | **x** | | **assume_role** | **x** | | ## 前提条件 - Treasure Dataの基本的な知識 ## S3 Bucket Policy 設定 TD リージョンと同じリージョンにある AWS S3 バケットを使用している場合、TD がバケットにアクセスする IP アドレスはプライベートで動的に変化します。アクセスを制限したい場合は、静的 IP アドレスではなく VPC の ID を指定してください。例えば、US リージョンの場合は vpc-df7066ba 経由でアクセスを設定し、Tokyo リージョンの場合は vpc-e630c182 経由、EU01 リージョンの場合は vpc-f54e6a9e 経由でアクセスを設定してください。 TD Console にログインする URL から TD Console のリージョンを確認し、URL 内のリージョンのデータコネクターを参照してください。 詳細については、[API ドキュメント](https://api-docs.treasuredata.com/en/overview/ip-addresses-integrations-result-workers/#s3-bucket-policy-configuration-for-export-and-import-integrations)を参照してください。 ## Treasure Data Integration の静的 IP アドレス セキュリティポリシーで IP ホワイトリストが必要な場合は、接続を成功させるために Treasure Data の IP アドレスを許可リストに追加する必要があります。 リージョンごとに整理された静的 IP アドレスの完全なリストは、次のリンクにあります: [https://api-docs.treasuredata.com/en/overview/ip-addresses-integrations-result-workers/](https://api-docs.treasuredata.com/en/overview/ip-addresses-integrations-result-workers/) ## インポート並列処理 非常に大きなファイルをインポートする場合、このインテグレーションが提供する並列インポートサポートを利用できます。これを行うには、大きなファイルを小さなファイルに分割し、小さなファイルをバッチで同時にアップロードします。ただし、非常に小さなファイルを大量にインポートしようとすると、パフォーマンスに悪影響を及ぼすことに注意してください。したがって、Treasure Dataでは、50MB未満のファイルサイズで並列入力を実行しないことを推奨しています。 使用できる並列インポートスレッドのデフォルトの最大数は16です。 ## TD Consoleを使用したAWS S3からのインポート TD Consoleを使用してデータコネクタを作成できます。 ### 新しい認証の作成 1. **TD Console**を開きます。 2. **Integrations Hub** > **Catalog**に移動します。 3. **S3 v2**を検索し、Amazon S3 (v2)を選択します。 4. **Create Authentication**を選択します。 ![](/assets/amazons3v2_b.159e893620e0c382d8217ff5d34162e687c00cced1f9998ec81f8b7128879b08.71fd65e8.png) 新しいAuthenticationダイアログが開きます。選択した認証方式によって、ダイアログは次のいずれかの画面のように表示される場合があります: ![](/assets/basic.a40f8fdb7d5da59cebad60061a7a57f41030506b340a4afd45975125551421a0.71fd65e8.png) ![](/assets/session.a2dea82cde621dbca0f47964e53b2f2e1af4cc2a6fd675bfd0ac27d49e1eaeb4.71fd65e8.png) ![](/assets/assume.cfe6bda430fc4bb1d38ab27c22a1f2245415fa2d419f46589c76dd7893fc7132.71fd65e8.png) 1. 認証フィールドを設定し、**Continue**を選択します。 | パラメータ | 説明 | | | --- | --- | --- | | **Endpoint** | S3サービスエンドポイントの上書き。リージョンとエンドポイント情報は、[AWS service endpoints](http://docs.aws.amazon.com/general/latest/gr/rande.md#s3_region)ドキュメントから確認できます。(例: [*s3.ap-northeast-1.amazonaws.com*](https://s3.ap-northeast-1.amazonaws.com/)) `指定すると、リージョン設定が上書きされます。` | | | **Region** | AWSリージョン | | | **Authentication Method** | **basic** | - access_key_idとsecret_access_keyを使用して認証します。[AWS Programmatic access](https://docs.aws.amazon.com/general/latest/gr/managing-aws-access-keys.md)を参照してください。 - Access Key ID - Secret access key | | **session** | - 一時的に生成されたaccess_key_id、secret_access_key、session_tokenを使用します。 - Access Key ID - Secret access key - Secret token | | | **assume_role** **(推奨)** | - ロールアクセスを使用します。[AWS AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.md)を参照してください。 - TD's Instance Profile - Account ID - Your Role Name - External ID - Duration In Seconds | | | **anonymous** | サポートされていません | | | **Access Key ID** | AWS S3が発行 | | | **Secret Access Key** | AWS S3から発行 | | | **Secret token** | | | | **TD's Instance Profile** | この値はTDコンソールから提供されます。この値の数値部分が、IAMロールを作成する際に使用するアカウントIDになります。 | | | **Account ID** | あなたのAWSアカウントID | | | **Your Role Name** | あなたのAWSロール名 | | | **External ID** | あなたのシークレット外部ID | | | **Duration In Seconds** | 一時認証情報の有効期間 | | 1. 新しいAWS S3接続に名前を付け、**Done**を選択します。 ### assume_role認証方式を使用した認証の作成 1. assume_role認証方式で新しい認証を作成します。 2. TD's Instance Profileフィールドの値の数値部分をメモしておきます。 ![](/assets/4f8559a3-4f70-4c83-b8b9-adaaec64662f_1_201_a.1331328bd097ab94743fc3d5f53d63f8cbc98ad689475b3adc5b21335a2e22e3.71fd65e8.jpeg) 1. AWS IAMロールを作成します。 ![](/assets/ea9e1f37-be45-4ac6-97fa-4b46f65b0388_1_201_a.99af6c7efd4bcd9e50a04d5457e1febf3da2f104b7a090d9bcc307dc3dc8d8c3.71fd65e8.jpeg) ![](/assets/45c6048c-cc9e-40c1-b0f4-529e356d6e16_1_201_a.bb869c9c9ad66cdecbebc9b2b1231acd5f24c98517c6bc2cfb6ec67efcd884ef.71fd65e8.jpeg) ### AWS S3データをTreasure Dataに転送する 認証済み接続を作成すると、自動的に認証ページに移動します。 1. 作成した接続を検索します。 2. **New Source**を選択します。 ![](/assets/image-20191014-185537.a673857cd3d7cd4d6249e93718c2c0b501d3da0ab1a5cfef2dd54c1fb6478775.71fd65e8.png) #### 接続 1. Data Transferフィールドに**Source**の名前を入力します**。** 2. **Next**をクリックします。 ![](/assets/s3_new.5fa3911b9f90a38cdf2daddcdf9cb8cebe026cc85658ca1f4da2ba69f80fc138.71fd65e8.png) #### ソーステーブル Sourceダイアログが開きます。 1. 以下のパラメータを編集します。 ![](/assets/image-20200714-230936.8f5e75b81b4ba3f8922f5ade1c5d5d06284c8f229cde7360b413f9e024fecf27.71fd65e8.png) | **パラメータ** | **説明** | | --- | --- | | **Bucket** | - S3バケット名を指定します(例: *your_bucket_name*) | | **Path Prefix** | **Path Prefix** | - ターゲットキーのプレフィックスを指定します。(例:*logs/data_*) | | **Path Regex** | - 正規表現を使用してファイルパスをマッチングします。ファイルパスが指定されたパターンにマッチしない場合、そのファイルはスキップされます。例えば、パターン *.csv$* # を指定した場合、パスがそのパターンにマッチしないファイルはスキップされます。[正規表現](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions)について詳しくは、こちらをご覧ください。 | | **Skip Glacier Objects** | - Amazon Glacierストレージクラスに保存されているオブジェクトの処理をスキップする場合に選択します。オブジェクトがGlacierストレージクラスに保存されているにもかかわらず、このオプションがチェックされていない場合、例外がスローされます。 | | **Filter by Modified Time** | - 取り込むファイルをフィルタリングする方法を選択します: | | 未チェック(デフォルト): | - **Start after path**: last_path パラメータを挿入して、最初の実行時にこのパスより前のファイルをスキップします。(例:logs/data_20170101.csv) - **Incremental**: インクリメンタルローディングを有効にします。インクリメンタルローディングが有効な場合、次回実行時の設定差分には last_path パラメータが含まれるため、次回実行時にそのパスより前のファイルがスキップされます。それ以外の場合、last_path は含まれません。 | | チェック済み: | - **Modified after:** last_modified_time パラメータを挿入して、最初の実行時に指定されたタイムスタンプより前に変更されたファイルをスキップします(例:2019-06-03T10:30:19.806Z) - **Incremental by Modified Time:** 変更時刻によるインクリメンタルローディングを有効にします。インクリメンタルローディングが有効な場合、次回実行時の設定差分には last_modified_time パラメータが含まれるため、次回実行時にその時刻より前に変更されたファイルがスキップされます。それ以外の場合、last_modified_time は含まれません。設定差分が設定されると、この値を変更することはできません | ディレクトリ(トップレベルディレクトリ「/」など)内のすべてのファイルをスキャンする必要がある場合があります。このような場合は、CLIを使用してインポートを実行する必要があります。 **例** Amazon CloudFrontは、静的および動的Webコンテンツの配信を高速化するWebサービスです。CloudFrontを設定して、CloudFrontが受信するすべてのユーザーリクエストに関する詳細情報を含むログファイルを作成できます。ロギングを有効にすると、CloudFrontを次のようにログファイルを保存するように設定できます: ``` [your_bucket] - [logging] - [E231A697YXWD39.2017-04-23-15.a103fd5a.gz][your_bucket] - [logging] - [E231A697YXWD39.2017-04-23-15.b2aede4a.gz][your_bucket] - [logging] - [E231A697YXWD39.2017-04-23-16.594fa8e6.gz][your_bucket] - [logging] - [E231A697YXWD39.2017-04-23-16.d12f42f9.gz] ``` この場合、Source Tableの設定は次のようになります: - **Bucket**: your_bucket - **Path Prefix**: logging/ - **Path Regex**: *.gz$* (必須ではありません) - **Start after path**: logging/E231A697YXWD39.2017-04-23-15.b2aede4a.gz (2017-04-23-16からログファイルをインポートする場合) - **Incremental**: true (このジョブをスケジュール設定する場合) BZip2デコーダープラグインはデフォルトでサポートされています。[File Decoder Function](https://docs.treasuredata.com/display/PD/File+Decoder+Function) を参照してください。 #### Data Settings 1. **Next** を選択します。 Data Settingsページが開きます。 2. 必要に応じて、データ設定を編集するか、このダイアログのページをスキップします。 ![](/assets/screenshot-2025-01-07-at-21.02.14.6aa2eac7a1fefcc0630398e0eec37ae0693703af3231fd00a30c26779a405617.71fd65e8.png) ### Filters Filters は、S3、FTP、または SFTP コネクターの Create Source または Edit Source インポート設定で使用できます。 Import Integration Filters を使用すると、インポート用の[データ設定の編集](https://docs.treasuredata.com/smart/project-product-documentation/editing-data-settings)を完了した後、インポートされたデータを変更できます。 import integration filters を適用するには: 1. Data Settings で **Next** を選択します。Filters ダイアログが開きます。 2. 追加したいフィルターオプションを選択します。![](/assets/image-20200609-201955.eed6c6da800ba40d1d98b92e767d9a8f7500cad8a9d4079121190b7d34c23294.c7246827.png) 3. **Add Filter** を選択します。そのフィルターのパラメーターダイアログが開きます。 4. パラメーターを編集します。各フィルタータイプの情報については、次のいずれかを参照してください: - Retaining Columns Filter - Adding Columns Filter - Dropping Columns Filter - Expanding JSON Filter - Digesting Filter 1. オプションで、同じタイプの別のフィルターを追加するには、特定の列フィルターダイアログ内で **Add** を選択します。 2. オプションで、別のタイプの別のフィルターを追加するには、リストからフィルターオプションを選択して、同じ手順を繰り返します。 3. 追加したいフィルターを追加した後、**Next** を選択します。Data Preview ダイアログが開きます。 ### Data Preview インポートを実行する前に、Generate Preview を選択してデータの[プレビュー](/products/customer-data-platform/integration-hub/batch/import/previewing-your-source-data)を表示できます。Data preview はオプションであり、選択した場合はダイアログの次のページに安全にスキップできます。 1. **Next** を選択します。Data Preview ページが開きます。 2. データをプレビューする場合は、**Generate Preview** を選択します。 3. データを確認します。 ### Data Placement データの配置について、データを配置したいターゲット database と table を選択し、インポートを実行する頻度を指定します。 1. **Next** を選択します。Storage の下で、インポートされたデータを配置する新しい database を作成するか、既存の database を選択し、新しい table を作成するか、既存の table を選択します。 2. **Database** を選択 > **Select an existing** または **Create New Database** を選択します。 3. オプションで、database 名を入力します。 4. **Table** を選択 > **Select an existing** または **Create New Table** を選択します。 5. オプションで、table 名を入力します。 6. データをインポートする方法を選択します。 - **Append** (デフォルト) - データインポートの結果は table に追加されます。 table が存在しない場合は作成されます。 - **Always Replace** - 既存の table の全体の内容をクエリの結果出力で置き換えます。table が存在しない場合は、新しい table が作成されます。 - **Replace on New Data** - 新しいデータがある場合のみ、既存の table の全体の内容をクエリの結果出力で置き換えます。 7. **Timestamp-based Partition Key** 列を選択します。 デフォルトキーとは異なるパーティションキーシードを設定したい場合は、long または timestamp 列をパーティショニング時刻として指定できます。デフォルトの時刻列として、add_time フィルターで upload_time を使用します。 8. データストレージの **Timezone** を選択します。 9. **Schedule** の下で、このクエリを実行するタイミングと頻度を選択できます。 #### 一度だけ実行 1. **Off** を選択します。 2. **Scheduling Timezone** を選択します。 3. **Create & Run Now** を選択します。 #### 定期的に繰り返す 1. **On** を選択します。 2. **Schedule** を選択します。UI では、*@hourly*、*@daily*、*@monthly*、またはカスタム *cron* の 4 つのオプションが提供されます。 3. **Delay Transfer** を選択して、実行時間の遅延を追加することもできます。 4. **Scheduling Timezone** を選択します。 5. **Create & Run Now** を選択します。 転送が実行された後、**Data Workbench** > **Databases** で転送の結果を確認できます。 ## Workflowを使用したAWS S3からのインポート Amazon S3 Import Integration v2のv1に対する主な違いと利点は、assume_role認証のサポートが追加されたことです。認証方法としてassume_roleを使用する場合、認証を明示的に宣言することはできません。認証を再利用したWorkflow設定については、[既存の認証の再利用](https://docs.treasuredata.com/articles/pd/reusing-an-existing-authentication)を参照してください。 Workflowは、一意のIDでジョブを開始できます。詳細については、[https://docs.digdag.io/operators/td_load.html](https://docs.digdag.io/operators/td_load.md#:~:text=you%20can%20use-,Unique%20ID,-instead%20of%20YAML)を参照してください。 ## CLI (Toolbelt)を使用したAWS S3からのインポート オプションで、TD Toolbeltを使用して接続の設定、ジョブの作成、ジョブ実行のスケジュール設定を行うことができます。 ### CLIを使用したコネクタの設定 コネクタを設定する前に、最新のTD Toolbeltをインストールしてください。 CLIとYAMLファイルを使用して増分ロードを計画している場合は、TDコンソールで既存のソースコネクタを使用する必要があります。増分ロード機能は、コンソールで処理された最後のレコードに関する情報を保持するためです。 #### Seed設定ファイル(seed.yml)の作成 以下の例に示すように、AWSアクセスキーを使用して*seed.yml*ファイルを設定します。バケット名とソースファイル名も指定する必要があります。オプションで、複数のファイルに一致させるためにpath_prefixを指定できます。以下の例では、path_prefix: `path/to/sample_fileは以下に一致します` - `path/to/sample_201501.csv.gz` - `path/to/sample_201502.csv.gz` - `path/to/sample_201505.csv.gz` - `など` path_prefixを先頭の'/'付きで使用すると、意図しない結果になる可能性があります。例えば、「path_prefix: /path/to/sample_file」とすると、プラグインはs3://sample_bucket//path/to/sample_fileでファイルを探すことになり、これはS3上では意図したパスs3://sample_bucket/path/to/sample_fileとは異なります。 ```yaml in: type: s3_v2 access_key_id: XXXXXXXXXX secret_access_key: YYYYYYYYYY bucket: sample_bucket # path to the *.json or *.csv or *.tsv file on your s3 bucket path_prefix: path/to/sample_file path_match_pattern: \.csv$ # a file will be skipped if its path doesn't match with this pattern ## some examples of regexp: #path_match_pattern: /archive/ # match files in .../archive/... directory #path_match_pattern: /data1/|/data2/ # match files in .../data1/... or .../data2/... directory #path_match_pattern: .csv$|.csv.gz$ # match files whose suffix is .csv or .csv.gz out: mode: append ``` 既存の認証を再利用する場合は、**td_authentication_id**設定キーの値に認証IDを設定します。これは、assume-role認証方法に必要です。[既存の認証の再利用](#reusing-the-existing-authentication)を参照してください。 #### フィールドの推測(load.ymlの生成) *connector:guess*は、ソースファイルを自動的に読み取り、ファイル形式とフィールドおよび列を評価します。 ```bash td connector:guess seed.yml -o load.yml ``` load.yml ファイルを確認すると、ファイル形式、エンコーディング、カラム名、型を含む「推測された」ファイル形式定義が表示されます。 ```yaml in: type: s3_v2 access_key_id: XXXXXXXXXX secret_access_key: YYYYYYYYYY bucket: sample_bucket path_prefix: path/to/sample_file parser: charset: UTF-8 newline: CRLF type: csv delimiter: ',' quote: '"' escape: '' skip_header_lines: 1 columns: - name: id type: long - name: company type: string - name: customer type: string - name: created_at type: timestamp format: '%Y-%m-%d %H:%M:%S' out: mode: append ``` *td connector:preview* コマンドを使用してデータのプレビューを表示できます。 ```bash td connector:preview load.yml ``` connector:guess コマンドはソースデータから3行以上、2カラム以上のデータを必要とします。これは、コマンドがソースデータのサンプル行を使用してカラム定義を評価するためです。 システムがカラム名またはカラムタイプを予期せず検出した場合は、load.yml を直接変更して再度プレビューしてください。 現在、Data Connector は "boolean"、"long"、"double"、"string"、"timestamp" タイプの解析をサポートしています。 #### Load Jobの実行 Load Job を送信します。データのサイズによっては数時間かかる場合があります。データを保存する Treasure Data のデータベースとテーブルを指定します。 Treasure Data のストレージは時刻でパーティション化されているため、`--time-column` オプションを指定することが推奨されます([data partitioning](http://docs.treasuredata.com/display/PD/Data+Partitioning+in+Treasure+Data) を参照)。このオプションが指定されていない場合、Data Connector は最初の *long* または *timestamp* カラムをパーティション化時刻として選択します。`--time-column` で指定するカラムの型は、*long* または *timestamp* のいずれかでなければなりません。 データに時刻カラムがない場合は、*add_time* フィルタオプションを使用して時刻カラムを追加できます。詳細については、[add_time filter plugin](http://docs.treasuredata.com/display/PD/add_time+Filter+Function) を参照してください。 ```bash $ td connector:issue load.yml --database td_sample_db --table td_sample_table \ --time-column created_at ``` ```bash $ td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column created_at --auto-create-table ``` データコネクタはサーバーサイドでレコードをソートしません。時間ベースのパーティショニングを効果的に使用するには、事前にファイル内のレコードをソートしておいてください。 *time*という名前のフィールドがある場合は、*--time-column*オプションを指定する必要はありません。 ``` td connector:issue load.yml --database td_sample_db --table td_sample_table ``` #### インポートモード load.ymlファイルのoutセクションでファイルインポートモードを指定できます。 out:セクションは、データがTreasure Dataテーブルにどのようにインポートされるかを制御します。 たとえば、Treasure Dataの既存のテーブルにデータを追加するか、データを置き換えるかを選択できます。 | **モード** | **説明** | **例** | | --- | --- | --- | | Append | レコードがターゲットテーブルに追加されます。 | `in: ...out: mode: append` | | Always Replace | ターゲットテーブルのデータを置き換えます。ターゲットテーブルに加えられた手動のスキーマ変更はそのまま保持されます。 | `in: ...out: mode: replace` | | Replace on new data | インポートする新しいデータがある場合にのみ、ターゲットテーブルのデータを置き換えます。 | `in: ...out: mode: replace_on_new_data` | ### スケジュール実行 増分ファイルインポートのために、データコネクタの定期実行をスケジュールできます。高可用性を確保するために、スケジューラーを慎重に設定しています。 スケジュールされたインポートでは、指定されたprefixに一致するすべてのファイルを、以下のいずれかのフィールドの条件でインポートできます: - use_modified_timeが無効の場合、最後のパスが次の実行のために保存されます。2回目以降の実行では、コネクタはアルファベット順で最後のパスの後にあるファイルのみをインポートします。 - それ以外の場合、ジョブが実行された時刻が次の実行のために保存されます。2回目以降の実行では、コネクタはその実行時刻以降にアルファベット順で変更されたファイルのみをインポートします。 ### TD Toolbeltを使用したスケジュールの作成 *td connector:create*コマンドを使用して新しいスケジュールを作成できます。 ```bash $ td connector:create daily_import "10 0 * * *" \ td_sample_db td_sample_table load.yml ``` Treasure Dataのストレージは時間でパーティション化されているため、*--time-column*オプションを指定することをお勧めします([データパーティショニング](http://docs.treasuredata.com/display/PD/Data+Partitioning+in+Treasure+Data)も参照してください)。 ``` $ td connector:create daily_import "10 0 * * *" \ td_sample_db td_sample_table load.yml \ --time-column created_at ``` `cron`パラメータは、`@hourly`、`@daily`、`@monthly`の3つの特別なオプションも受け入れます。 デフォルトでは、スケジュールはUTCタイムゾーンで設定されます。-tまたは--timezoneオプションを使用して、タイムゾーンでスケジュールを設定できます。`--timezone`オプションは、'Asia/Tokyo'、'America/Los_Angeles'などの拡張タイムゾーン形式のみをサポートします。PST、CSTなどのタイムゾーンの略語は*サポートされておらず*、予期しないスケジュールにつながる可能性があります。 ### すべてのスケジュールの一覧表示 *td connector:list*コマンドを実行すると、現在スケジュールされているエントリのリストを確認できます。 ``` $ td connector:list ``` td connector:list ``` ### スケジュール設定と履歴の表示 ``` td connector:show daily_importName ``` `td connector:history` はスケジュールエントリの実行履歴を表示します。各実行の結果を調査するには、td job jobid を使用してください。 ``` td connector:history ``` ### スケジュールの削除 td connector:delete はスケジュールを削除します。 ``` td connector:delete daily_import ``` ### IAM 権限の設定 *connector:guess* および *connector:issue* コマンドで使用される YML 設定ファイルに指定された IAM 認証情報は、アクセスする必要がある AWS S3 リソースに対する権限を持っている必要があります。IAM ユーザーがこれらの権限を持っていない場合は、事前定義されたポリシー定義のいずれかでユーザーを設定するか、JSON 形式で新しいポリシー定義を作成してください。 以下の例は、[Policy Definition reference](http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.md) 形式に基づいています。これは、IAM ユーザーに「your-bucket」への*読み取り専用*権限(GetObject および ListBucket アクション経由)を与えます。 ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::your-bucket", "arn:aws:s3:::your-bucket/*" ] } ] } ``` 「`your-bucket`」を実際の S3 バケット名に置き換えてください。 ### 一時的な認証情報プロバイダとして AWS Security Token Service (STS) を使用する 特定の場合において、access_key_id と secret_access_key による IAM 基本認証はリスクが高すぎる可能性があります(ジョブの実行時やセッションの作成後に secret_access_key が明示的に表示されることはありませんが)。 S3 データコネクタは、AWS Secure Token Service (STS) を使用して [Temporary Security Credentials](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.md) を提供できます。AWS STS を使用すると、任意の IAM ユーザーが自身の access_key_id と secret_access_key を使用して、特定の有効期限を持つ以下の一時キーを作成できます: - new_access_key_id - new_secret_access_key - session_token keys 以下はTemporary Security Credentialsのタイプです: - [**Session Token**](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_getsessiontoken.md) 有効期限が指定された最もシンプルなSecurity Credentialsです。temporary credentialsは、それを生成したIAMユーザーと同じアクセス権を持ちます。これらのcredentialsは、有効期限が切れておらず、元のIAMユーザーの権限が変更されていない限り有効です。 - [**Federation Token**](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_getfederationtoken.md) これは上記のSession Tokenに対して追加の権限制御レイヤーを追加します。Federation Tokenを生成する際、IAMユーザーはPermission Policy定義を指定する必要があります。このスコープを使用して、Federation Tokenの所有者がアクセスできるリソースを制限できます(トークンを付与するIAMユーザーのアクセス権より少なくすることができます)。任意の[Permission Policy](http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.md)定義を使用できますが、権限のスコープはトークンを生成したIAMユーザーの権限と同じか、そのサブセットに制限されます。Session Tokenと同様に、Federation Token credentialsは有効期限が切れておらず、元のIAM credentialsに関連付けられた権限が変更されていない限り有効です。 AWS STS Temporary Security Credentialsは、[AWS CLI](https://aws.amazon.com/cli/)または任意の言語の[AWS SDK](https://aws.amazon.com/tools/)を使用して生成できます。 #### Session Token ```bash aws sts get-session-token --duration-seconds 900 ``` #### Federation Token この例では、 - `temp_creds`はFederated tokenまたはユーザーのtemp credentialsの名前です。 - `bucketname`はアクセスが許可されるS3バケットの名前です。(詳細については[ARN specification](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.md#arn-syntax-s3)を参照してください) - `s3:GetObject`と`s3:ListBucket`はAWS S3バケットの基本的な読み取り操作です。 ```bash aws sts get-federation-token --name temp_creds --duration-seconds 900 \ --policy '{"Statement": [{"Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": "arn:aws:s3:::bucketname"}]}' ``` AWS STS credentialsは取り消すことができません。有効期限が切れるか、credentialsを生成するために使用した元のIAMユーザーの権限を削除または取り消すまで有効です。 Temporary Security Credentialsが生成されたら、*seed.yml*ファイルに`SecretAccessKey`、`AccessKeyId`、`SessionToken`を含め、通常通りS3用のData Connectorを実行します。 ``` in: type: s3_v2 auth_method: session access_key_id: XXXXXXXXXX secret_access_key: YYYYYYYYYY session_token: ZZZZZZZZZZ bucket: sample_bucket path_prefix: path/to/sample_file ``` #### Credential Expiration STS credentialsは指定された時間後に有効期限が切れるため、credentialを使用するdata connector jobは最終的に失敗し始める可能性があります。現在、STS credentialsの有効期限が切れたと報告された場合、data connector jobは最大回数(5回)までリトライし、最終的に「error」のstatusで完了します。 インポートを確認するには、[Validating Your Data Connector Jobs](https://docs.treasuredata.com/display/INT/Amazon+S3+Import+Integration+v2#AmazonS3ImportIntegrationv2-validate)の手順を参照してください。 ## 既存のAuthenticationの再利用 この機能により、TD console UIで定義された既存のauthenticationを再利用できます。 1. [Importing from AWS S3 using TD Console](/ja/int/amazon-s3-import-integration-v2#AmazonS3ImportIntegrationv2-ImportingfromAWSS3usingTDConsole)の手順に従ってauthenticationを作成します。 2. **Integrations Hub** > **Authentications**画面に移動します 3. 保存されたAuthenticationをクリックします。 4. Authentication IDはブラウザのURLに表示される番号です ![](/assets/assume_role.b8145f783521c29da2c5b02358d1f5d696da7eef4b05bf71608d33bd43055686.71fd65e8.png) 5. 上記の Authentication ID を config キー **td_authentication_id** として使用し、TD Workflow または CLI(Toolbelt)の設定を作成します。 6. Authentication を再利用した設定の例 ## Workflow 設定 ```yaml +import_from_s3_assume_role_with_existing_connection: td_load>: cfg_load.yml database: test_db table: test_tbl ## cfg_load.yml in: type: s3_v2 bucket: sample_bucket path_prefix: path/to/sample_file td_authentication_id: 287355 parser: charset: UTF-8 newline: CRLF type: csv delimiter: "," quote: "\"" escape: "\"" trim_if_not_quoted: false skip_header_lines: 1 allow_extra_columns: false allow_optional_columns: false columns: - name: col_1 type: string - name: col_2 type: string ``` ### CLI 設定 Seed 設定の例(seed.yml) ```yaml in: type: s3_v2 td_authentication_id: 287355 bucket: sample_bucket path_prefix: path/to/sample_file ```