Amazon S3 バケットにあるオブジェクトへのクロスアカウントアクセスを提供する方法を教えてください。

最終更新日: 2020 年 5 月 7 日

別の AWS アカウントに対して、Amazon Simple Storage Service (Amazon S3) バケットに保存されているオブジェクトへのアクセスを許可したいです。Amazon S3 バケットへのクロスアカウントアクセスを許可する方法を教えてください。

簡単な説明

S3 バケットに保存されているオブジェクトへのクロスアカウントアクセスを許可するには、以下のいずれかの方法を使用します。

  • S3 バケットオブジェクトへのプログラムによるアクセスのみのリソースベースのポリシーと AWS Identity and Access Management (IAM) ポリシー
  • S3 バケットオブジェクトへのプログラムによるアクセスのみのリソースベースのアクセスコントロールリスト (ACL) と IAM ポリシー
  • S3 バケットオブジェクトへのプログラムによるアクセスとコンソールアクセスのためのクロスアカウント IAM ロール

提供するアクセスのタイプに応じて、以下のいずれかのソリューションを使用して、S3 バケットに保存されているオブジェクトへの詳細なクロスアカウントアクセスを付与します。次の例では、別の AWS アカウント (アカウント B) のユーザーにアクセス権限を付与して、アカウント (アカウント A) が所有する S3 バケット内のオブジェクトをユーザーが管理できるようにします。

注意: アカウント ID、バケット名、ARN などを含めるようにポリシーを更新してください。

解決方法

リソースベースのポリシーと IAM ポリシー

バケットポリシーを使用して、クロスアカウントコントロールを管理し、S3 オブジェクトのアクセス許可を監査します。バケットレベルでバケットポリシーを適用する場合、アクセスできるユーザー (Principal 要素)、アクセスできるオブジェクト (Resource 要素)、アクセス方法 (Action 要素) を定義できます。バケットポリシーをバケットレベルで適用すると、複数のポリシーを使用してアクセスを制御することで、バケット内のさまざまなオブジェクトへの詳細なアクセスを定義できます。バケットポリシーを確認して、S3 バケット内のオブジェクトにアクセスできるユーザーを確認することもできます。バケットポリシーを使用して S3 バケットアクセスを管理するには、以下の手順通りに実行します。

1.    アカウント A で S3 バケットを作成します。

2.    アカウント B で IAM ロールまたはユーザーを作成します。

3.    アカウント B の IAM ロールまたはユーザーに、この IAM ポリシーを使って特定の S3 バケットに対してオブジェクトのダウンロード (GET Object) およびアップロード (PUT Object) を行うアクセス許可を付与します。このポリシーは、アカウント B の IAM ロールまたはユーザーに対して、PUT Object acl を呼び出してバケット所有者にオブジェクトアクセス許可を付与します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
  "s3:PutObject",
  "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountABucketName/*"
 
        }
    ]
}

注意: "arn:aws:s3:::AccountABucketName/FolderName/*" など、リソース要素にフォルダ名を定義することで、アカウント A の特定のバケットフォルダへのアクセスを制限できます。詳細については、IAM ポリシーを使用して特定のフォルダへのユーザー固有のアクセスを許可するにはどうしたらよいですか? を参照してください。

4.    アカウント A のバケットポリシーを設定して、アカウント B で作成した IAM ロールまたはユーザーにアクセス許可を付与します。このバケットポリシーを使用して、アカウント A が所有するバケット内のオブジェクトに対する GetObject および PutObject へのアクセス許可をユーザーに付与します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::AccountABucketName/*"
            ]
        }
    ]
}

注意: "Resource": "arn:aws:s3:::AccountABucketName/FolderName/*" など、リソース要素で特定の S3 バケットフォルダを定義して、より制限されたアクセスを許可できます。条件を指定して s3:PutObject アクセス許可を使用することで、バケット所有者は他のアカウントによってアップロードされたオブジェクトを完全に制御できます。その後、特定のヘッダーで ACL を適用すると、PutObject API 呼び出し内で渡されます。詳細については、バケット所有者がフルコントロールを取得する必要がある条件で s3:PutObject アクセス許可を付与するを参照してください。

リソースベースのアクセスコントロールリスト (ACL) と IAM ポリシー

オブジェクト ACL を使用して、特定のシナリオでのみ、および ACL が IAM および S3 バケットポリシーよりもニーズを満たしている場合にのみ、アクセス許可を管理します。詳細については、ACL ベースのアクセスポリシー (バケットとオブジェクト ACL) を使用するタイミングを参照してください。Amazon S3 ACL では、READ、WRITE、READ_ACP、WRITE_ACP、および FULL_CONTROL のアクセス許可セットのみを定義できます。Amazon S3 ACL のアクセス許可を与えられるユーザーは、AWS アカウントまたは事前定義された Amazon S3 グループのうちから 1 つのみを使用できます。AWS アカウントの E メールアドレスまたは正規ユーザー ID を指定する場合、ACL はアクセス許可を与えられるユーザーの AWS アカウントにあるすべてのエンティティに適用されます。ACL を使用して、個々の IAM ユーザーまたはロールへのアクセスを制限することはできません。同じプレフィックスを共有する異なるオブジェクトに ACL を適用することはできません。

注意: バケット所有者は、ACL アクセス許可を与えられるユーザーがアップロードしたオブジェクトを完全に制御できない場合があります。これは、ACL が承認する S3 オペレーションの条件を ACL がサポートしていないことに起因します。

バケットとオブジェクト ACL を使用して S3 バケットへのアクセスを管理するには、以下の手順通りに実行します。

1.    アカウント B で IAM ロールまたはユーザーを作成します。次に、必要な Amazon S3 オペレーションを実行するアクセス許可をそのロールまたはユーザーに付与します。PutObject と GetObject を呼び出すユーザーには、リソースベースのポリシーと IAM ポリシーにリストされているアクセス許可が必要です。

2.    少なくともアカウント B の WRITE アクセス許可を含めるようにバケット ACL を設定します。これにより、アカウント B の IAM ロールまたはユーザーは、アカウント A が所有するバケットにオブジェクトをアップロード (PutObject API を呼び出す) できます。

...
<AccessControlPolicy>
  <Owner>
    <ID> AccountACanonicalUserID </ID>
    <DisplayName> AccountADisplayName </DisplayName>
  </Owner>
  <AccessControlList>
...
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID> AccountBCanonicalUserID </ID>
        <DisplayName> AccountBDisplayName </DisplayName>
      </Grantee>
      <Permission> WRITE </Permission>
    </Grant>
    ...
  </AccessControlList>
</AccessControlPolicy>

注意: CanonicalUserID を見つけるには、AWS アカウントの正規ユーザー ID の検索を参照してください。

3.    少なくともアカウント B の READ アクセス許可を含めるようにオブジェクト ACL を設定します。これにより、アカウント B の IAM ロールまたはユーザーが、アカウント A が所有するバケットからオブジェクトをダウンロード (GetObject API を呼び出す) できます。  

...
<AccessControlPolicy>
  <Owner>
    <ID> AccountACanonicalUserID </ID>
    <DisplayName> AccountADisplayName </DisplayName>
  </Owner>
  <AccessControlList>
...
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID> AccountBCanonicalUserID </ID>
        <DisplayName> AccountBDisplayName </DisplayName>
      </Grantee>
      <Permission> READ </Permission>
    </Grant>
    ...
  </AccessControlList>
</AccessControlPolicy>

ACL のアクセス許可は、ACL が適用される S3 リソース、バケット、オブジェクトによって異なります。詳細については、アクセスコントロールリスト (ACL) の概要を参照してください。バケットを作成するとき、または既存のバケットにオブジェクトをアップロードするときに、バケットとオブジェクト ACL を設定できます。詳細については、ACL の管理を参照してください。

クロスアカウント IAM ロール

すべての AWS サービスがリソースベースのポリシーをサポートしているわけではありません。つまり、複数のサービスへのクロスアカウントアクセスを提供するときに、クロスアカウントの IAM ロールを使用してアクセス許可の管理を一元化できます。クロスアカウント IAM ロールを使用すると、複数の S3 バケットに保存されている S3 オブジェクトへのクロスアカウントアクセスのプロビジョニングが簡素化され、S3 バケットの複数のポリシーを管理する必要がなくなります。この方法で、別の AWS アカウントまたは AWS のサービスによって所有またはアップロードされたオブジェクトへのクロスアカウントアクセスを許可します。クロスアカウント IAM ロールを使用しない場合は、オブジェクト ACL を変更する必要があります。詳細については、Amazon S3 がオブジェクトオペレーションのリクエストを承認する方法を参照してください。

クロスアカウント IAM ロールを使用して S3 バケットアクセスを管理するには、以下の手順通りに実行します。

1.    アカウント A で IAM ロールを作成します。次に、必要な S3 オペレーションを実行するアクセス許可をロールに付与します。ロールの信頼ポリシーで、アカウント B のロールまたはユーザーに、アカウント A のロールを引き受けるアクセス許可を付与します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

次のアクセスポリシーでは、このロールを引き受けたユーザーが、プログラムで Amazon S3 コンソールを使用してオブジェクトのダウンロードとアップロードを許可します。詳細については、IAM ポリシーを使用して特定のフォルダへのユーザー固有のアクセスを許可するにはどうしたらよいですか? を参照してください。

注意: プログラムによるアクセスのみが必要な場合は、次のポリシーのステートメントから最初の 2 つを削除できます。  

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::AccountABucketName"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::AccountABucketName/*"
        }
    ]
}

2.    アカウント B の IAM ロールまたはユーザーに、アカウント A で作成した IAM ロールを引き受けるアクセス許可を付与します。 

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::AccountA:role/AccountARole"
  }
}

3.    アカウント B のロールまたはユーザーから、アカウント A のロールをプログラムで引き受けることで、アカウント B の IAM エンティティが必要な S3 オペレーションを実行できるようにします。詳細については、ロールの切り替え (コンソール) を参照してください。

注意: アカウント A の IAM ロールを引き受けると、Amazon S3 オペレーションはアクセスポリシーによって決まります。IAM ロールは、アカウント A のローカル IAM エンティティによって行われた API 呼び出しと見なされます。クロスアカウントアクセス用のバケットポリシーまたは ACL は必要ありません。詳細については、Amazon S3 アクションをご参照ください。