アカウント A の AWS Transfer Family サーバーが、別のアカウント、つまりアカウント B の Amazon Simple Storage Service (Amazon S3) バケットにアクセスできるようにしたい。バケットへのクロスアカウントアクセスでサーバーをセットアップしたい。
簡単な説明
以下の手順を実行してください。
- アカウント A のバケットにアクセスするための AWS Identity and Access Management (IAM) ロールを作成します。
- アカウント B の IAM ロールにクロスアカウントアクセスを付与するようにバケットポリシーを更新します。
- アカウント A の IAM ロールで設定された Transfer Family サーバーユーザーを作成します。
- アカウント A の Transfer Family サーバーユーザーがアカウント B の S3 バケットにアクセスできることを確認します。
- (オプション) S3 オブジェクトの所有権をアカウント B でバケット所有者優先に設定します。
注: AWS Transfer Family コンソールには、同じアカウントの Amazon S3 バケットのみが表示されます。別のアカウントのバケットで Transfer Family サーバーを使用するには、AWS Command Line Interface (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"
]
}
]
}
注: クロスアカウント S3 のアップロードを行うには、Transfer Family で 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 要素はオプションです。指定した IAM ロールにのみバケットアクセスを付与するには、Condition 要素を含めます。または、要素を削除して、サーバーが属するアカウントからすべての IAM ロールとユーザーへのアクセスを付与します。
アカウント A の 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 "/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 のバケットにアクセスできることを確認する
1. 作成したユーザーとしてサーバーに接続します。例えば、次の OpenSSH コマンドは SFTP サーバーに接続します。
$ sftp -i myserveruser MY_SERVER_USER_NAME@MY_SERVER_ID.server.transfer.us-east-1.amazonaws.com
2. テストとして、バケットのホームディレクトリを一覧表示します。OpenSSH を使用している場合は、次のコマンドを実行します。
$ ls
コマンドがホームディレクトリを返した場合、サーバーユーザーはバケットへのクロスアカウントアクセス権を持ちます。
(オプション) S3 オブジェクトの所有権をアカウント B でバケット所有者優先に設定する
デフォルトでは、Amazon S3 オブジェクトは、オブジェクトをアップロードした AWS アカウントによって所有されます。つまり、送信先バケットにアップロードされたオブジェクトは、デフォルトでソースサーバーのアカウントによって所有されます。
クロスアカウントアップロードのオブジェクトを送信先アカウントが自動的に所有できるようにするには、送信先バケットの S3 オブジェクトの所有権をバケット所有者優先に設定します。これを行うと、AWS Transfer Family サーバー経由でアップロードされたすべての新しいオブジェクトは、送信先バケットのアカウントによって自動的に所有されます。
関連情報
ユーザーの作成 (AWS Transfer Family ユーザーガイド)
ユーザーの追加 (AWS Transfer Family ユーザーガイド)
Amazon S3 がリクエストを承認する方法