最新のAuroraアップデート(1.8)では、コマンドLOAD DATA FROM S3
が導入されました。誰かがこれを機能させましたか? 1.8にアップグレードした後、セットアップガイドここに従って、RDSからS3へのアクセスを許可するロールを作成しました。
サーバーを再起動してコマンドを実行しようとした後
LOAD DATA FROM S3 PREFIX 's3://<bucket_name>/prefix' INTO TABLE table_name
sQL Workbench/Jでは、エラーが発生します。
Warnings:
S3 API returned error: Missing Credentials: Cannot instantiate S3 Client
S3 API returned error: Failed to instantiate S3 Client
Internal error: Unable to initialize S3Stream
追加の手順は必要ですか? SDKからのみ実行できますか?ドキュメントのどこかに記載されていることはわかりません
同じ問題がありました。私のRDSインスタンスが使用していたIAMロールにAmazonS3FullAccessを追加してみました...
ぶらぶらした後、RDSコンソールからClustersに移動しました。 Auroraクラスターを選択し、[IAMロールの管理]をクリックしました。ドロップダウンが表示され、IAMロール(個々のインスタンスが使用していたものと同じもの)を選択しました。
それを実行すると、すべてが順調に進み、データのロードは素晴らしく高速でした。
したがって、(私たちにとって)5つのステップ/コンポーネントがあります。
1)ユーザーがオブジェクトをアップロードできるようにするS3バケットとバケットポリシー
{
"Version": "2012-10-17",
"Id": "Policy1453918146601",
"Statement": [
{
"Sid": "Stmt1453917898368",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account id>:<user/group/role>/<IAM User/Group/Role>"
},
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::<bucket name>/*"
}
]
}
「プリンシパル」は、RDSインスタンスがデータをインポートできるように、バケットにデータファイルをアップロードするIAMユーザー、グループ、またはロールです。
2)IAMポリシー:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1486490368000",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucket name>/*"
]
}
]
}
これは、Policy Generatorを使用すると非常に簡単です。
3)IAMロールを作成します。
この役割には、上記のIAMポリシーを割り当てる必要があります。将来、他のロールにこのポリシーを使用しない場合は、おそらくインラインポリシーも実行できますが、必要に応じて後で参照できる定義済みのポリシーを用意しておくのが好きです。
4)クラスター/インスタンスがaws_default_s3_role値を上記の#3のロールのARNに設定するために使用するパラメーターグループを構成します。
5)クラスターに移動し、クラスターを選択して、[IAMロールの管理]を選択し、DBクラスターのIAMロールを設定して、Auroraクラスターを構成します。
少なくとも私にとって、これらのステップは魅力のように機能しました。
お役に立てば幸いです。
上記のすべての提案の後、最後のステップとして、VPCエンドポイントをS3に追加する必要がありました。その後、すべてが機能し始めました。
2019年3月:
RDSコンソールには、役割を変更するオプションがありません。私にとってうまくいったのは、CLI経由でロールを追加してから、ライターインスタンスを再起動することです。
aws rds add-role-to-db-cluster --db-cluster-identifier my-cluster --role-arn arn:aws:iam::123456789012:role/AllowAuroraS3Role
唯一のエラーがInternal error: Unable to initialize S3Stream
そしてそれはすぐにこのエラーを投げます、考えられる犯人は次のとおりです:
パスには次の値が含まれます。
- リージョン(オプション)–ロード元のAmazon S3バケットを含むAWSリージョン。この値はオプションです。リージョン値を指定しない場合、AuroraはDBクラスターと同じリージョンのAmazon S3からファイルをロードします。
- bucket-name –ロードするデータを含むAmazon S3バケットの名前。仮想フォルダパスを識別するオブジェクトプレフィックスがサポートされています。
- file-name-or-prefix – Amazon S3テキストファイルまたはXMLファイルの名前、またはロードする1つ以上のテキストファイルまたはXMLファイルを識別するプレフィックス。ロードする1つ以上のテキストファイルを識別するマニフェストファイルを指定することもできます。
私はこのエラーが発生する可能性がある複数の機会を経験しました。
このエラーは、「LOAD」SQLをしばらく(約220秒)実行した後にスローされました。これは、不審なタイムアウトのケースです。最後に、RDSのサブネットグループには、S3へのアウトバウンドを除くアウトバウンドが1つしかないことがわかりました。送信ルールを追加することにより、この問題を修正できます。
エラーはすぐにスローされました(0.2秒)。以前はS3からデータを正常にロードしていましたが、突然S3のURLが変更されたため、このエラーが再び発生しました。間違ったS3 URLを使用していました。ファイルの代わりにS3プレフィックスを使用したかったので。 'Load'構文をチェックして、SQLを正しくします。
Amazon Auroraチームに連絡したところ、一部のサーバーでこの問題が発生しているEdgeケースがあることが確認されました。彼らはすぐに問題を修正するパッチを公開していますが、その間、手動でパッチをクラスターに適用しました。
IAMで設定したロールにAmazonS3ReadOnlyAccessまたはAmazonS3FullAccessポリシーをアタッチする必要があります。この手順は、セットアップガイドには含まれていません。
AWSコンソールで[IAM]-> [Roles]に移動し、使用しているロールを選択して、[attach policy]をクリックし、S3ポリシーまで下にスクロールして1つ選択します。
私にとって、作成したRDSロールをS3バケットに追加する手順がありませんでした。追加するとすぐに機能しました。
ステップ2から5を実行し、S3アクセス用のVPCエンドポイントを作成することで、私にとってはうまくいきました。