Amazon S3 からのデータ インポート中のアクセス拒否エラーのトラブルシューティング
このドキュメントでは、Amazon S3 からTiDB Cloudにデータをインポートするときに発生する可能性のあるアクセス拒否エラーのトラブルシューティング方法について説明します。
TiDB Cloudコンソールの[データのインポート]ページで[次へ]をクリックしてインポート プロセスを確認すると、 TiDB Cloud は、指定されたバケット URI のデータにアクセスできるかどうかの検証を開始します。キーワードAccessDeniedを含むエラー メッセージが表示された場合は、アクセス拒否エラーが発生しています。
アクセス拒否エラーのトラブルシューティングを行うには、AWS マネジメント コンソールで次のチェックを実行します。
IAMロールのポリシーを確認する
- AWS マネジメント コンソールで、 [IAM] > [アクセス管理] > [ロール]に移動します。
- ロールのリストで、ターゲットの TiDB クラスター用に作成したロールを見つけてクリックします。ロールの概要ページが表示されます。
- 役割の概要ページの[アクセス許可ポリシー]領域に、ポリシーの一覧が表示されます。ポリシーごとに次の手順を実行します。
- ポリシーをクリックして、ポリシーの概要ページに入ります。
- ポリシーの概要ページで、 {}JSONタブをクリックして権限ポリシーを確認します。ポリシーの
Resourceフィールドが正しく構成されていることを確認してください。
以下はポリシーの例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::tidb-cloud-source-data/mydata/*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::tidb-cloud-source-data"
},
{
"Sid": "AllowKMSkey",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": "arn:aws:kms:ap-northeast-1:105880447796:key/c3046e91-fdfc-4f3a-acff-00597dd3801f"
}
]
}
このサンプル ポリシーでは、次の点に注意してください。
"arn:aws:s3:::tidb-cloud-source-data/mydata/*"の"arn:aws:s3:::tidb-cloud-source-data"はサンプルの S3 バケット ARN で、/mydata/*はデータ ストレージ用に S3 バケットのルート レベルでカスタマイズできるディレクトリです。ディレクトリは/*で終わる必要があります (例:"<Your S3 bucket ARN>/<Directory of your source data>/*"。/*を追加しないと、AccessDeniedエラーが発生します。カスタマーマネージド キー暗号化を使用して AWS Key Management Service キー (SSE-KMS) を有効にしている場合は、次の設定がポリシーに含まれていることを確認してください。
"arn:aws:kms:ap-northeast-1:105880447796:key/c3046e91-fdfc-4f3a-acff-00597dd3801f"バケットのサンプル KMS キーです。{ "Sid": "AllowKMSkey", "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:ap-northeast-1:105880447796:key/c3046e91-fdfc-4f3a-acff-00597dd3801f" }バケット内のオブジェクトが別の暗号化されたバケットからコピーされたものである場合、KMS キーの値には両方のバケットのキーを含める必要があります。たとえば、
"Resource": ["arn:aws:kms:ap-northeast-1:105880447796:key/c3046e91-fdfc-4f3a-acff-00597dd3801f","arn:aws:kms:ap-northeast-1:495580073302:key/0d7926a7-6ecc-4bf7-a9c1-a38f0faec0cd"]です。
前の例に示すようにポリシーが正しく構成されていない場合は、ポリシーのResourceフィールドを修正し、データのインポートを再試行してください。
ヒント:
アクセス許可ポリシーを複数回更新しても、データのインポート中に
AccessDeniedエラーが発生する場合は、アクティブなセッションの取り消しを試みることができます。 [IAM] > [Access Management] > [Roles]に移動し、目的のロールをクリックしてロールの概要ページに入ります。役割の概要ページで、 [アクティブなセッションを取り消す] を見つけて、ボタンをクリックしてアクティブなセッションを取り消します。次に、データのインポートを再試行します。これは、他のアプリケーションに影響を与える可能性があることに注意してください。
バケット ポリシーを確認する
- AWS マネジメント コンソールで、Amazon S3 コンソールを開き、 [バケット]ページに移動します。バケットのリストが表示されます。
- リストで、ターゲット バケットを見つけてクリックします。バケット情報ページが表示されます。
- [アクセス許可]タブをクリックし、 [バケット ポリシー]領域まで下にスクロールします。デフォルトでは、この領域にはポリシー値がありません。この領域に拒否されたポリシーが表示されている場合、データのインポート中に
AccessDeniedエラーが発生する可能性があります。
拒否されたポリシーが表示された場合は、そのポリシーが現在のデータ インポートに関連しているかどうかを確認してください。存在する場合は、エリアから削除して、データのインポートを再試行してください。
信頼エンティティを確認する
- AWS マネジメント コンソールで、 [IAM] > [アクセス管理] > [ロール]に移動します。
- ロールのリストで、ターゲットの TiDB クラスター用に作成したロールを見つけてクリックします。ロールの概要ページが表示されます。
- ロールの概要ページで、 [信頼関係]タブをクリックすると、信頼されたエンティティが表示されます。
以下は、サンプルの信頼エンティティです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::380838443567:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "696e6672612d617069a79c22fa5740944bf8bb32e4a0c4e3fe"
}
}
}
]
}
サンプルの信頼エンティティでは:
380838443567はTiDB Cloudアカウント ID です。信頼エンティティのこのフィールドがTiDB Cloudアカウント ID と一致していることを確認してください。696e6672612d617069a79c22fa5740944bf8bb32e4a0c4e3feはTiDB Cloudの外部 ID です。信頼できるエンティティのこのフィールドがTiDB Cloud外部 ID と一致することを確認してください。
オブジェクトの所有権を確認する
AWS マネジメント コンソールで、Amazon S3 コンソールを開き、 [バケット]ページに移動します。バケットのリストが表示されます。
バケットのリストで、対象のバケットを見つけてクリックします。バケット情報ページが表示されます。
バケット情報ページで、 [権限]タブをクリックし、 [オブジェクトの所有権]領域まで下にスクロールします。 「オブジェクト所有権」構成が「バケット所有者の強制」であることを確認してください。
構成が「バケット所有者の強制」ではない場合、アカウントにはこのバケット内のすべてのオブジェクトに対する十分な権限がないため、エラー
AccessDeniedが発生します。
エラーを処理するには、[オブジェクトの所有権] 領域の右上隅にある[編集]をクリックし、所有権を「バケット所有者の強制」に変更します。これは、このバケットを使用している他のアプリケーションに影響を与える可能性があることに注意してください。
バケットの暗号化タイプを確認する
S3 バケットを暗号化する方法は複数あります。バケット内のオブジェクトにアクセスしようとする場合、作成したロールには、データ復号化のための暗号化キーにアクセスする権限が必要です。それ以外の場合、 AccessDeniedエラーが発生します。
バケットの暗号化タイプを確認するには、次の手順を実行します。
- AWS マネジメント コンソールで、Amazon S3 コンソールを開き、 [バケット]ページに移動します。バケットのリストが表示されます。
- バケットのリストで、対象のバケットを見つけてクリックします。バケット情報ページが表示されます。
- バケット情報ページで、 [プロパティ]タブをクリックし、 [デフォルトの暗号化]領域まで下にスクロールして、この領域の構成を確認します。
サーバー側の暗号化には、Amazon S3 マネージド キー (SSE-S3) と AWS Key Management Service (SSE-KMS) の 2 種類があります。 SSE-S3 の場合、この暗号化タイプではアクセス拒否エラーが発生しないため、これ以上のチェックは必要ありません。 SSE-KMS の場合、以下を確認する必要があります。
- エリア内の AWS KMS キー ARN が下線なしの黒で表示されている場合、その AWS KMS キーは AWS が管理するキー (aws/s3) です。
- エリア内の AWS KMS キー ARN が青色でリンク付きで表示されている場合は、キー ARN をクリックしてキー情報ページを開きます。左側のナビゲーション バーをチェックして、特定の暗号化の種類を確認します。これは、AWS 管理のキー (aws/s3) またはカスタマー管理のキーである可能性があります。
SSE-KMS の AWS 管理キー (aws/s3) の場合
この状況でエラーAccessDeniedが発生した場合、その理由はキーが読み取り専用であり、クロスアカウント権限の付与が許可されていないことが原因である可能性があります。詳細については、AWS の記事クロスアカウント ユーザーがカスタム AWS KMS キーで暗号化された S3 オブジェクトにアクセスしようとすると、アクセス拒否エラーが発生するのはなぜですかを参照してください。
アクセス拒否エラーを解決するには、 [デフォルトの暗号化]領域の右上隅にある[編集]をクリックし、AWS KMS キーを [AWS KMS キーから選択] または [AWS KMS キー ARN を入力] に変更するか、サーバーを変更します。側の暗号化タイプを「AWS S3 マネージド キー (SSE-S3)」に変更します。この方法に加えて、新しいバケットを作成し、カスタム マネージド キーまたは SSE-S3 暗号化方法を使用することもできます。
SSE-KMS のカスタマー マネージド キーの場合
この状況でエラーAccessDeniedを解決するには、キー ARN をクリックするか、KMS で手動でキーを見つけます。キー ユーザーページが表示されます。領域の右上隅にある[追加]をクリックして、データをTiDB Cloudにインポートするために使用したロールを追加します。次に、データのインポートを再試行します。
ノート:
バケット内のオブジェクトが既存の暗号化されたバケットからコピーされたものである場合は、AWS KMS キー ARN にソース バケットのキーも含める必要があります。これは、バケット内のオブジェクトがソース オブジェクトの暗号化と同じ暗号化方式を使用しているためです。詳細については、AWS ドキュメントレプリケーションでのデフォルトの暗号化の使用を参照してください。
手順については、AWS の記事を確認してください
上記のすべてのチェックを実行してもAccessDeniedエラーが発生する場合は、AWS の記事Amazon S3 からの 403 Access Denied エラーのトラブルシューティング方法で詳細な手順を確認できます。