別の AWS アカウントにある Amazon S3 バケットを使用するように AWS Transfer Family サーバーを設定する方法を教えてください。

最終更新日: 2021 年 1 月 15 日

AWS Transfer Family サーバーから、別の AWS アカウントの Amazon Simple Storage Service (Amazon S3) バケットにアクセスしたいと考えています。バケットへのクロスアカウントアクセスを許可するようにサーバーを設定するにはどうすればよいですか?

簡単な説明

以下の手順を実行してください。

  1. バケットにアクセスするための AWS Identity and Access Management (IAM) ロールを作成します。
  2. IAM ロールへのクロスアカウントアクセスを付与するようにバケットポリシーを更新します。
  3. IAM ロールで設定された Transfer Family サーバーユーザーを作成します。
  4. Transfer Family サーバーユーザーがバケットにアクセスできることを確認します。
  5. (オプション) S3 オブジェクトの所有権をバケット所有者優先に設定します。

注: AWS Transfer Family コンソールには、同じアカウントの S3 バケットのみが表示されます。別のアカウントのバケットで Transfer Family サーバーを使用するには、AWS コマンドラインインターフェイス (AWS CLI) または AWS SDK を使用する必要があります。

解決方法

バケットへのアクセス権限を持つ IAM ロールを作成する

サーバーユーザーの IAM ロールを作成します。ロールの IAM ポリシーでは、以下を使用します。

注: destination-DOC-EXAMPLE-BUCKET を、サーバーがアクセスする S3 バケットの名前に置き換えます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListingBucketReadandWriteandDelete",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
      ]
    }
  ]
}

IAM ロールを作成したら、以下のように、get-role コマンドを実行してロールの ID を取得します。

$ aws iam get-role --role-name "ROLE_NAME"

次の手順では、ロール ID が必要です。

IAM ロールへのクロスアカウントアクセスを付与するようにバケットポリシーを更新する

作成した IAM ロールへのアクセス権を付与するように、宛先バケットのポリシーを変更します。以下のようなバケットポリシーを使用できます。

注: arn:aws:iam::123456789012:root を、サーバーが属するアカウントの Amazon リソースネーム (ARN) に置き換えます。destination-DOC-EXAMPLE-BUCKET をバケットの名前に置き換えます。AROA1234567890 を、作成した IAM ロールのロール ID に置き換えます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "BucketPolicyForTransferFamily",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "StringLike": {
          "aws:userId": "AROA1234567890:*"
        }
      }
    }
  ]
}

このポリシー例の Condition 要素はオプションです。指定した IAM ロールにのみバケットアクセスを付与するには、Condition 要素を含めます。または、要素を削除して、サーバーが属するアカウントからすべての IAM ロールとユーザーへのアクセスを付与します。

IAM ロールで設定された Transfer Family サーバーユーザーを作成する

1.    Transfer Family サーバーの SSH キーを生成します。

2.    サーバーのサーバー ID を取得します。

3.    AWS CLI を使用して create-user コマンドを実行します。--server-id に、サーバーの ID を入力します。--role に、作成した IAM ロールの ARN を入力します。--ssh-public-key-body に、SSH キーの作成時に生成した .pub ファイルの内容を入力します。

$ aws transfer create-user --user-name "MY_SERVER_USER_NAME" --server-id "MY_SERVER_ID"  --role "MY_IAM_ROLE_ARN" --home-directory "/DOC-EXAMPLE-BUCKET/MY_SERVER_USER_NAME" --ssh-public-key-body "CONTENTS_OF_MY_SSH_.PUB_FILE"

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

コマンドは、作成したサーバー ID とユーザーを返します。

{
  "ServerId": "MY_SERVER_ID",
  "UserName": "MY_SERVER_USER_NAME"
}

重要: サーバーユーザーのアクセスをホームディレクトリのみに制限するには、IAM でスコープダウンポリシーを作成します。その後、サーバーユーザーのプロパティを編集して 、作成したスコープダウンポリシーを適用します。

Transfer Family サーバーユーザーがバケットにアクセスできることを確認する

1.    作成したユーザーとしてサーバーに接続します。例えば、次の OpenSSH コマンドは SFTP サーバーに接続します。

$ sftp -i myserveruser MY_SERVER_USER_NAME@MY_SERVER_ID.server.transfer.us-east-1.amazonaws.com

2.    テストとして、バケットのホームディレクトリを一覧表示します。OpenSSH を使用している場合は、次のコマンドを実行します。

$ ls

コマンドがホームディレクトリを返した場合、サーバーユーザーはバケットへのクロスアカウントアクセス権を持ちます。

(オプション) S3 オブジェクトの所有権をバケット所有者優先に設定する

デフォルトでは、Amazon S3 オブジェクトは、オブジェクトをアップロードした AWS アカウントによって所有されます。つまり、送信先バケットにアップロードされたオブジェクトは、デフォルトでソースサーバーのアカウントによって所有されます。

クロスアカウントアップロードのオブジェクトを送信先アカウントが自動的に所有できるようにするには、送信先バケットの S3 オブジェクトの所有権をバケット所有者優先に設定します。これを行うと、AWS Transfer Family サーバー経由でアップロードされたすべての新しいオブジェクトは、送信先バケットのアカウントによって自動的に所有されます。


ユーザーの作成 (AWS Transfer Family ユーザーガイド)

ユーザーの追加 (AWS Transfer Family ユーザーガイド)

Amazon S3 がリクエストを承認する方法

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?