アカウント A の AWS Transfer Family サーバーが、別のアカウント、つまりアカウント B の Amazon Simple Storage Service (Amazon S3) バケットにアクセスできるようにして、バケットへのクロスアカウントアクセスが可能なサーバーを設定したいと思います。
概要
次の手順を実行します。
- バケットへのアクセス権を持つ AWS Identity and Access Management (IAM) ロールをアカウント A に作成します。
- バケットポリシーを更新して、アカウント B の IAM ロールへのクロスアカウントアクセスを許可します。
- アカウント A の IAM ロールを使用して設定された Transfer Family サーバーユーザーを作成します。
- アカウント A の Transfer Family サーバーユーザーがアカウント B の S3 バケットにアクセスできることを確認します。
- (オプション) S3 オブジェクトの所有権を、アカウント B の希望するバケット所有者に設定します。
注: AWS Transfer Family コンソールには、同じアカウントの Amazon S3 バケットのみが表示されます。Transfer Family サーバーを別のアカウントのバケットで使用するには、AWS コマンドラインインターフェイス (AWS CLI) または AWS SDK を使用する必要があります。
解決策
アカウント A 内に、バケットにアクセスできる 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"
]
}
]
}
注: Transfer Family がクロスアカウントS3アップロードを行うには、s3:PutObjectACL 権限が必要です。
IAM ロールを作成したら、次のように get-role コマンドを実行してロールの ID を取得します。
$ aws iam get-role --role-name "ROLE_NAME"
次のステップにはロール ID が必要です。
バケットポリシーを更新して、アカウント B の 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 の要素はオプションです。Condition の要素を含めると、指定した IAM ロールにのみバケットアクセスを許可します。要素を削除すると、サーバーが属するアカウントのすべての IAM ロールとユーザーにアクセス権を付与します。
アカウント A の IAM ロールを持つ Transfer Family サーバーユーザーを作成する
1. Transfer Family サーバー用の SSH キーを生成します。
-
サーバーのサーバー ID を取得します。
-
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 "/destination-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 でスコープダウンポリシーを作成します。次に、サーバーユーザーのプロパティを編集して、作成したスコープダウンポリシーを適用します。
アカウント A の Transfer Family サーバーユーザーがアカウント B のファイルシステムにアクセスできることを確認する
- 作成したユーザーとしてサーバーに接続します。例えば、次の OpenSSH コマンドは SFTP サーバーに接続します。
$ sftp -i myserveruser MY_SERVER_USER_NAME@MY_SERVER_ID.server.transfer.us-east-1.amazonaws.com
- テストとして、バケットのホームディレクトリをリスト表示します。OpenSSH を使用している場合は、次のコマンドを実行します。
$ ls
コマンドがホームディレクトリを返す場合、そのサーバーユーザーは バケットへのクロスアカウントアクセスが許可されています。
(オプション) S3 オブジェクトの所有権をアカウント B で希望するバケット所有者に設定
デフォルトでは、Amazon S3 オブジェクトはオブジェクトをアップロードした AWS アカウントが所有します。つまり、宛先バケットにアップロードされたオブジェクトは、デフォルトで送信元サーバーのアカウントが所有しています。
クロスアカウントアップロードのオブジェクトを自動的に所有するように宛先アカウントを有効にするには、宛先バケットの S3 オブジェクト所有権を希望するバケット所有者に設定します。これを行うと、AWS Transfer Family サーバーを介してアップロードされたすべての新しいオブジェクトは、宛先バケットのアカウントによって自動的に所有されます。
関連情報
CreateUser (AWS Transfer Family ユーザーガイド)
ユーザーを追加 (AWS Transfer Family ユーザーガイド)
Amazon S3 がリクエストを承認する方法