【トラブル】【AWS】クロスアカウントでのS3アクセスに関するトラブル

■ はじめに

 クロスアカウントでのS3アクセスに関して
複数の原因があってハマりにハマったので、メモしておく。

目次

【0】教訓:S3バケットのアクセストラブルの勘所
【1】エラー「An error occured (403) when calling the HeadObject operation: Forbidden」が表示
【2】エラー「The ciphertext refers to a custom master key ...」が表示

【0】教訓:S3バケットのアクセストラブルの勘所

* 以下の点を落ち着いて当たってみるといいかも、、、

1)S3へアクセスしているIAM roleで、
  アクセスするS3にアクセス許可しているか
2)S3 Policyで、S3へアクセスしているIAM roleを許可しているか
 => S3 と IAM role のお互いが許可しているか確認

KMSで暗号化している場合

3)KMSのKey policyで、S3へアクセスしているロールを許可しているか
4)S3へアクセスしているロールがKMS使用を許可しているか
 => KMS と IAM role のお互いが許可しているか確認

【1】エラー「An error occured (403) when calling the HeadObject operation: Forbidden」が表示

Boto3 API で、クロスアカウント上のKMSキーで暗号化しているS3バケット内の
ファイルをダウンロードした際に以下「エラー内容」が表示されてしまう

1)エラー内容

botocore.exceptions.ClientError:
An error occured (403) when calling the HeadObject operation: Forbidden

2)原因

* 原因は、2点。

原因・その1

* アクセス先のS3バケットのPolicyでGlue Job のロールが許可されていなかった
 => 確認方法としては、対象S3バケットを選択し、タブ[Permissions]の配下の
  「Bucket Policy」を参照する

原因・その2

* 以下の2点。

[1] Glue で使用しているロールのPollicyで
  対象S3バケットを許可していなかったため
[2] Glue で使用しているロールのPollicyで
  対象S3バケットに紐づけいるKMSキーの使用許可がなかったため

3)解決案

* 以下の通り。
 => ただし、また別エラーが発生(【2】を参照)

原因・その1の解決案

* アクセス先のS3バケットのPolicyでGlue Job のロールが追加
 => 今回の場合、ReadObject/ListBucketを許可するようにPolicyを修正

原因・その2の解決案

* Glue で使用しているロールのPollicyを修正
 => 今回の場合、以下の通り。

[1] GetObjectを許可しているPolicyのResourceに対して
 対象S3バケットのARNを追加
[2] kms:Encrypt/DescribeKey/Decryptなどを許可しているPolicyのResourceに対して
 対象S3バケットのKMSのARNを追加

【2】エラー「The ciphertext refers to a custom master key ...」が表示

 Glue JobからBoto3 API を使い、
クロスアカウント上のKMSキーで暗号化しているS3バケット内の
ファイルをダウンロードした際に以下「エラー内容」が表示されてしまう

1)エラー内容

botocore.exceptions.ClientError:
An error occured (AccessDenied) when calling the GetObject operation:
The ciphertext refers to a custom master key that does not exists,
does not exist in this region, or you are not allowed to access.

2)原因

S3バケットに紐づいているKMSキーのKey Policyで
Glue Job のロールが許可されていなかった

 => 確認方法としては、対象S3バケットを選択し、タブ[Permissions]の配下の
  「Default encryption」で指定されているKMSキーのリンクから参照できる

3)解決案

KMSキーのPolicyでGlue Job のロールを許可するように修正する
 => 今回の場合、kms:Encrypt/DescribeKey/Decryptなどを許可している
  Key PolicyのResourceに対して使用しているGlue JobのロールのARNを追加

関連記事

IAM ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2017/02/26/231046
IAM ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2022/07/03/000000
IAM ~ クロスアカウント ~
https://dk521123.hatenablog.com/entry/2022/05/23/000000
IAM ~ 別AWSアカウントのS3にファイルアップロード ~
https://dk521123.hatenablog.com/entry/2024/03/08/003841