

# 例 2: バケット所有者がクロスアカウントのバケットのアクセス許可を付与する
<a name="example-walkthroughs-managing-access-example2"></a>

**重要**  
アクセス許可は、個々のユーザーではなく、IAM ロールに付与することをお勧めします。これを行う方法については、「[クロスアカウントのアクセス許可の理解と IAM ロールの使用](example-walkthroughs-managing-access-example4.md#access-policies-walkthrough-example4-overview)」を参照してください。

**Topics**
+ [チュートリアルの準備をする](#cross-acct-access-step0)
+ [ステップ 1: アカウント A のタスクを実行する](#access-policies-walkthrough-cross-account-permissions-acctA-tasks)
+ [ステップ 2: アカウント B のタスクを実行する](#access-policies-walkthrough-cross-account-permissions-acctB-tasks)
+ [ステップ 3: (オプション) 明示的な拒否を試す](#access-policies-walkthrough-example2-explicit-deny)
+ [ステップ 4: クリーンアップする](#access-policies-walkthrough-example2-cleanup-step)

ある AWS アカウント (例えば、アカウント A) で、バケットやオブジェクトなど、そのリソースにアクセスするためのアクセス許可を、別の AWS アカウント (アカウント B) に付与できます。アカウント B では、そのアカウントのユーザーに、付与されたアクセス許可を委任できます。この例のシナリオでは、バケット所有者が、特定のバケットオペレーションを実行するためのクロスアカウントアクセス許可を別のアカウントに付与します。

**注記**  
また、バケットポリシーを使用して、アカウント A から直接アカウント B のユーザーにアクセス許可を付与することもできます。ただし、このユーザーには、アカウント B がアカウント A からアクセス許可を付与されていない場合でも、ユーザーが属している親アカウントであるアカウント B からのアクセス許可が必要です。このユーザーがリソース所有者と親アカウントの両方からのアクセス許可を持っている場合にのみ、ユーザーはリソースにアクセスできます。

この手順の概要を以下に示します。

![\[ある AWS アカウント がアカウントのリソースへのアクセス許可を別の AWS アカウント に付与している状況を描いた図。\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/access-policy-ex2.png)


1. アカウント A の管理者ユーザーは、特定のバケットオペレーションを実行するためのクロスアカウントアクセス許可をアカウント B に付与するバケットポリシーをアタッチします。

   アカウント B の管理者ユーザーは、自動的にこのアクセス許可を継承することに注意してください。

1. アカウント B の管理者ユーザーは、アカウント A から受け取ったアクセス許可を委任するユーザーポリシーをユーザーにアタッチします。

1. アカウント B のユーザーは、アカウント A が所有するバケットのオブジェクトにアクセスすることにより、アクセス許可を確認します。

この例では、2 個のアカウントが必要です。次の表に、これらのアカウントとそれぞれの管理者ユーザーの呼び方を示します。IAM ガイドライン (「[管理者ユーザーを使用したリソースの作成とアクセス許可の付与について](example-walkthroughs-managing-access.md#about-using-root-credentials)」を参照) に従い、このチュートリアルではルートユーザー認証情報は使用しません。その代わりに、各アカウントで管理者ユーザーを作成し、その認証情報を使用してリソースを作成し、アクセス許可を付与します。


| AWS アカウント ID | アカウントの呼び方 | アカウントの管理者ユーザー  | 
| --- | --- | --- | 
|  *1111-1111-1111*  |  アカウント A  |  AccountAadmin  | 
|  *2222-2222-2222*  |  アカウント B  |  AccountBadmin  | 

ユーザーを作成し、アクセス許可を付与するためのすべてのタスクは、AWS マネジメントコンソールで実行します。このチュートリアルでは、許可を検証するために、コマンドラインツールの AWS Command Line Interface (CLI) と AWS Tools for Windows PowerShell を使用するので、コードを記述する必要はありません。

## チュートリアルの準備をする
<a name="cross-acct-access-step0"></a>

1. 前のセクションの表に示したように、2 個の AWS アカウントがあり、各アカウントに 1 人ずつの管理者ユーザーが存在することを確認します。

   1. 必要な場合、AWS アカウントにサインアップします。

   1. アカウント A の認証情報を使用して、[IAM コンソール](https://console.aws.amazon.com/iam/home?#home)にサインインし、管理者ユーザーを作成します。

      1. ユーザー **AccountAadmin** を作成して、セキュリティ認証情報を書き留めます。手順については、「*IAM ユーザーガイド*」の「[AWS アカウント での IAM ユーザーの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)」を参照してください。

      1. フルアクセスを付与するユーザーポリシーをアタッチして、管理者に **AccountAadmin** を付与します。手順については、[IAM ユーザーガイド](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)の *IAM ポリシーの管理*を参照してください。

   1. IAM コンソールの **[ダッシュボード]** の **IAM ユーザーサインイン URL** をメモします このアカウントのすべてのユーザーは、AWS マネジメントコンソール にサインインするときにこの URL を使用する必要があります。

      詳細については、*IAM ユーザーガイド*の[ユーザーがお客様のアカウントにサインインする方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_how-users-sign-in.html) を参照してください。

   1. 前述のステップを、アカウント B の認証情報を使用してもう一度実行し、管理者ユーザー **AccountBadmin** を作成します。

1. AWS Command Line Interface (AWS CLI) または AWS Tools for Windows PowerShell をセットアップします。管理者ユーザーの認証情報は以下のように保存します。
   + AWS CLI を使用する場合は、設定ファイルに `AccountAadmin` と `AccountBadmin` の 2 つのプロファイルを作成します。
   + AWS Tools for Windows PowerShell を使用する場合は、セッションの認証情報を `AccountAadmin` および `AccountBadmin` として保存します。

   手順については、「[チュートリアル用のツールのセットアップ](policy-eval-walkthrough-download-awscli.md)」を参照してください。

1. プロファイルとも呼ばれる、管理者ユーザーの認証情報を保存します。入力する各コマンドで認証情報を指定する代わりにプロファイル名を使用できます。詳細については、「[チュートリアル用のツールのセットアップ](policy-eval-walkthrough-download-awscli.md)」を参照してください。

   1. 2 つのアカウントの管理者ユーザー (`AccountAadmin` および `AccountBadmin`) のそれぞれの AWS CLI 認証情報ファイルにプロファイルを追加します。

      ```
      [AccountAadmin]
      aws_access_key_id = access-key-ID
      aws_secret_access_key = secret-access-key
      region = us-east-1
      
      [AccountBadmin]
      aws_access_key_id = access-key-ID
      aws_secret_access_key = secret-access-key
      region = us-east-1
      ```

   1. AWS Tools for Windows PowerShell を使用している場合は、次のコマンドを実行します。

      ```
      set-awscredentials –AccessKey AcctA-access-key-ID –SecretKey AcctA-secret-access-key –storeas AccountAadmin
      set-awscredentials –AccessKey AcctB-access-key-ID –SecretKey AcctB-secret-access-key –storeas AccountBadmin
      ```

## ステップ 1: アカウント A のタスクを実行する
<a name="access-policies-walkthrough-cross-account-permissions-acctA-tasks"></a>

### ステップ 1.1: AWS マネジメントコンソールにサインインする
<a name="access-policies-walkthrough-cross-account-permissions-acctA-tasks-sign-in"></a>

アカウント A で IAM ユーザーのサインイン URL を使用して、まず **AccountAadmin** ユーザーとして AWS マネジメントコンソール にサインインします。このユーザーはバケットを作成し、ポリシーをアタッチします。

### ステップ 1.2: バケットを作成する
<a name="access-policies-walkthrough-example2a-create-bucket"></a>

1. Amazon S3 コンソールでバケットを作成します。この演習では、米国東部 (バージニア北部) AWS リージョン に `amzn-s3-demo-bucket` という名前でバケットを作成することを前提とします。

   手順については、「[汎用バケットの作成](create-bucket-overview.md)」を参照してください。

1. サンプルオブジェクトをバケットにアップロードします。

   方法については、[ステップ 2: バケットにオブジェクトをアップロードする](GetStartedWithS3.md#uploading-an-object-bucket) を参照してください。

### ステップ 1.3: クロスアカウントアクセス許可を付与するバケットポリシーをアカウント B にアタッチする
<a name="access-policies-walkthrough-example2a"></a>

このバケットポリシーは、`s3:GetLifecycleConfiguration` および `s3:ListBucket` アクセス許可をアカウント B に付与します。これは、**AccountAadmin** ユーザーの認証情報を使用してコンソールにサインインしていることを前提としています。

1. 次のバケットポリシーを `amzn-s3-demo-bucket` にアタッチします。このポリシーは、アカウント B に `s3:GetLifecycleConfiguration` および `s3:ListBucket` アクションのアクセス許可を付与します。

   手順については、「[Amazon S3 コンソールを使用したバケットポリシーの追加](add-bucket-policy.md)」を参照してください。

------
#### [ JSON ]

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
         {
            "Sid": "Example permissions",
            "Effect": "Allow",
            "Principal": {
               "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": [
               "s3:GetLifecycleConfiguration",
               "s3:ListBucket"
            ],
            "Resource": [
               "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
         }
      ]
   }
   ```

------

1. アカウント B (とその管理ユーザー) がオペレーションを実行できることを確認します。
   + AWS CLI を使用して検証する

     ```
     aws s3 ls s3://amzn-s3-demo-bucket --profile AccountBadmin
     aws s3api get-bucket-lifecycle-configuration --bucket amzn-s3-demo-bucket --profile AccountBadmin
     ```
   + AWS Tools for Windows PowerShell を使用して検証する

     ```
     get-s3object -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBadmin 
     get-s3bucketlifecycleconfiguration -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBadmin
     ```

## ステップ 2: アカウント B のタスクを実行する
<a name="access-policies-walkthrough-cross-account-permissions-acctB-tasks"></a>

次に、アカウント B の管理者はユーザー Dave を作成し、アカウント A から受け取ったアクセス許可を委任します。

### ステップ 2.1: AWS マネジメントコンソールにサインインする
<a name="access-policies-walkthrough-cross-account-permissions-acctB-tasks-sign-in"></a>

アカウント B の IAM ユーザーのサインイン URL を使用し、**AccountBadmin** ユーザーとして AWS マネジメントコンソール にサインインします。

### ステップ 2.2: アカウント B でユーザー Dave を作成する
<a name="access-policies-walkthrough-example2b-create-user"></a>

[IAM コンソール](https://console.aws.amazon.com/iam/)で、ユーザー **Dave** を作成します。

手順については、「IAM ユーザーガイド」の「[IAM ユーザーの作成 (コンソール)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)」を参照してください。**

### ステップ 2.3: ユーザー Dave に許可を委任する
<a name="access-policies-walkthrough-example2-delegate-perm-userdave"></a>

以下のポリシーを使用して、ユーザー Dave のインラインポリシーを作成します。バケット名を指定してポリシーを更新する必要があります。

これは、**AccountBadmin** ユーザーの認証情報を使用してコンソールにサインインしていることを前提としています。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "Example",
         "Effect": "Allow",
         "Action": [
            "s3:ListBucket"
         ],
         "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket"
         ]
      }
   ]
}
```

------

手順については、「IAM ユーザーガイド」の「[IAM ポリシーを管理する](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html)」を参照してください。**

### ステップ 2.4: アクセス許可をテストする
<a name="access-policies-walkthrough-example2b-user-dave-access"></a>

これで、アカウント B の Dave はアカウント A が所有する `amzn-s3-demo-bucket` の内容をリストできます。次のいずれかの手順でアクセス許可を確認できます。

**AWS CLI を使用してアクセス許可をテストする**

1. AWS CLI 設定ファイルに `UserDave` プロファイルを追加します。設定ファイルの詳細については、[チュートリアル用のツールのセットアップ](policy-eval-walkthrough-download-awscli.md) を参照してください。

   ```
   [profile UserDave]
   aws_access_key_id = access-key
   aws_secret_access_key = secret-access-key
   region = us-east-1
   ```

1. コマンドプロンプトで、次の AWS CLI コマンドを入力して、Dave がアカウント A によって所有される `amzn-s3-demo-bucket` からオブジェクトリストを取得できることを検証します。このコマンドでは、`UserDave` プロファイルを指定していることに注意してください。

   ```
   aws s3 ls s3://amzn-s3-demo-bucket --profile UserDave
   ```

   Dave には他のアクセス許可はありません。したがって、他のオペレーション (次の `get-bucket-lifecycle` 設定など) を実行しようとすると、Amazon S3 はアクセス許可の拒否を返します。

   ```
   aws s3api get-bucket-lifecycle-configuration --bucket amzn-s3-demo-bucket --profile UserDave
   ```

**AWS Tools for Windows PowerShell を使用してアクセス許可をテストする**

1. Dave の認証情報を `AccountBDave` という名前で保存します。

   ```
   set-awscredentials -AccessKey AccessKeyID -SecretKey SecretAccessKey -storeas AccountBDave
   ```

1. List Bucket コマンドを試してみます。

   ```
   get-s3object -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBDave
   ```

   Dave には他のアクセス許可はありません。したがって、他のオペレーション (次の `get-s3bucketlifecycleconfiguration` など) を実行しようとすると、Amazon S3 はアクセス許可の拒否を返します。

   ```
   get-s3bucketlifecycleconfiguration -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBDave
   ```

## ステップ 3: (オプション) 明示的な拒否を試す
<a name="access-policies-walkthrough-example2-explicit-deny"></a>

アクセスコントロールリスト (ACL)、バケットポリシー、またはユーザーポリシーを使用して、アクセス許可を付与できます。ただし、バケットポリシーまたはユーザーポリシーによって明示的な拒否が設定されている場合、他のアクセス許可よりも明示的な拒否が優先されます。テストのために、バケットポリシーを更新し、アカウント B の `s3:ListBucket` アクセス許可を明示的に拒否してみます。このポリシーでは、`s3:ListBucket` アクセス許可も付与されます。ただし、明示的な拒否が優先され、アカウント B またはアカウント B のユーザーは `amzn-s3-demo-bucket` 内のオブジェクトを一覧表示を行うことはできません。

1. アカウント A のユーザー `AccountAadmin` の認証情報を使用して、バケットポリシーを次のように置き換えます。

1. ここで `AccountBadmin` の認証情報を使用してバケットリストを取得しようとすると、アクセスは拒否されます。
   + AWS CLI を使用して、次のコマンドを実行します。

     ```
     aws s3 ls s3://amzn-s3-demo-bucket --profile AccountBadmin
     ```
   + AWS Tools for Windows PowerShell を使用して、次のコマンドを実行します。

     ```
     get-s3object -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBDave
     ```

## ステップ 4: クリーンアップする
<a name="access-policies-walkthrough-example2-cleanup-step"></a>

1. テストが終了したら、次の手順でクリーンアップを行います。

   1. アカウント A の認証情報を使用して AWS マネジメントコンソール ([AWS マネジメントコンソール](https://console.aws.amazon.com/)) にサインインし、次の操作を行います。
     + Amazon S3 コンソールで、`amzn-s3-demo-bucket` にアタッチされているバケットポリシーを削除します。バケットの **[プロパティ]** で、**[アクセス許可]** セクションのポリシーを削除します。
     + バケットをこの演習のために作成した場合は、Amazon S3 コンソールでオブジェクトを削除してから、バケットを削除します。
     + [IAM コンソール](https://console.aws.amazon.com/iam/)で、`AccountAadmin` ユーザーを削除します。

1. アカウント B の認証情報を使用して [IAM コンソール](https://console.aws.amazon.com/iam/)にサインインします。`AccountBadmin` ユーザーを削除します。手順については、「IAM ユーザーガイド」の「[IAM ユーザーの削除](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html#id_users_deleting)」を参照してください。**