AWS Storage Gatewayを使用して、EC2に構築したWindowsに、他アカウントのS3バケットをドライブマウントしてみました。
登場するリソースが多く設定も複雑なので、まずは今回作成する構成図を示します。

アカウントAにStorage Gatewayを立てて、アカウントBのWindowからStorage Gateway経由でS3をドライブマウントします。
AWS Storage Gateway は、オンプレミスにあるファイルサーバなどのストレージとAmazon S3の大容量ストレージを密接に連携させ、堅牢かつ可用性の高いストレージを構築することが可能になるサービスです。
aws.amazon.com
構築はアカウントAでの作業です。
ドライブマウントするバケットを作成します。
バケット名:test-storagegw-bucket

セキュリティグループ作成
Storage Gatewayのインスタンス用のセキュリティグループを作成します。
セキュリティグループ名:test-storagegw-sg
インバウンドルール:

S3エンドポイント用のセキュリティグループを作成します。
セキュリティグループ名:test-s3endpoint-sg
インバウンドルール:

エンドポイント作成
Storage Gatewayを使用して、S3バケットとプライベート通信をするために、エンドポイントを作成します。
エンドポイント名:test-s3-ep
サービス:S3 Interface型

セキュリティグループは前述の「test-s3endpoint-sg」を選択します。

Storage Gatewayから「ゲートウェイ」→「ゲートウェイの作成」を押下します。

ゲートウェイ名:test-storagegw-gw
ゲートウェイタイプ:Amazon S3 ファイルゲートウェイ

ホストプラットフォームに「Amazon EC2」を選択して、「設定をカスタマイズ」→「インスタンスの起動」を押下します。
ここでインスタンスの要件が記述されており、インスタンスタイプは「m5.xlarge」、EBSは追加で「150GiB」必要になります。

インスタンス作成の画面に遷移しますので、要件通りに作成しています。
インスタンス名:test-storagegw-ec2
インスタンスタイプ:m5.xlarge

後ほどSSHログインに必要なため、キーペアを作成しておきます。
ネットワークはパブリックに配置します。
パブリックIPの自動割り当ては、後ほどElastic IPを割り当てるため無効化しておきます。
セキュリティグループは最初に作成した、「test-storagegw-sg」を選択します。

ストレージはルートボリュームに加え、150GiBのEBSボリュームを追加します。

インスタンスが起動しました。

Elastic IPを割り当てます。


インスタンスにElastic IPが割り当てられていることを確認します。

ゲートウェイ作成の画面に戻り、「ゲートウェイのセットアップの確認」にチェックを付け、次に進みます。

IPアドレスに「test-storagegw-eip」のIPアドレスを入力し、次に進みます。

設定を確認し、「次へ」を押下します。

ここまでの設定がうまくいくと、「ゲートウェイの設定」画面に遷移します。
「キャッシュストレージの設定」にてローカルディスクをロードしているので1分程度待ちます。

ロードが完了したら、「CloudWatchロググループ」と「CloudWatchアラーム」の作成を選択して、「設定」を押下します。

ゲートウェイが作成されました。

注意
「ゲートウェイの設定」に遷移せず、以下のようなエラーが表示された場合は、設定が間違っている可能性があります。
よくある間違いとして、入力したIPアドレスやセキュリティグループの誤りがありますので、設定を確認してみましょう。

ファイル共有作成
Storage Gatewayの「ファイル共有」→「ファイル共有の作成」を押下します。

先ほど作成したゲートウェイ「test-storagegw-gw」を選択します。
バケットは最初に作成した「test-storagegw-bucket」を入力します。
「S3のVPCエンドポイントを使用」にチェックを付けて、最初に作成したVPCエンドポイントIDを選択します。

注意
エンドポイントのサービスがS3ではなかったり、インバウンドに443が許可されていない場合、以下のようなエラーが表示されますので、設定を確認してみましょう。

オブジェクトへのアクセスは「SMB」を選択します。
監査ログ用のロググループは作成します。
Storage Gatewayは、EBS→S3の場合は即時共有されますが、S3→EBSは即時共有されません。
そこで、「S3からのキャッシュの自動更新」で更新頻度を設定します。
ここではTTL5分とします。

ストレージ設定はデフォルトのままにします。

SMBの認証方法を「ゲストアクセス」にして、「ゲストパスワード」を設定します。

最後に設定を確認して、「作成」を押下します。

作成が完了するまで1分ほど待ちます。
ステータスが「更新中」→「使用不可」→「利用可能」と遷移します。
「使用不可」と表示されても焦らず待ってみましょう。



ファイル共有が作成されると、詳細画面からドライブマウントのコマンドを取得できるので、コピーしておきましょう。

ここで、ファイル共有の作成過程で作成されたロールも確認しておきましょう。
「StorageGatewayBucketAccessRole~」というサービスロールが作成されています。
Storage GatewayがS3との共有に必要な権限が設定されています。

許可
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetAccelerateConfiguration",
"s3:GetBucketLocation",
"s3:GetBucketVersioning",
"s3:ListBucket",
"s3:ListBucketVersions",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::test-storagegw-bucket",
"Effect": "Allow"
},
{
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::test-storagegw-bucket/*",
"Effect": "Allow"
}
]
}
信頼関係
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "storagegateway.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": “<accountID>",
"aws:SourceArn": "arn:aws:storagegateway:ap-northeast-1:“<accountID>:gateway/<gatewayID>"
}
}
}
]
}
挙動の確認
ドライブマウント確認
アカウントBのEC2に立てたWindowからドライブマウントをしてみます。

このWindowはElastic IPを使ってインターネット通信を行います。

ファイル共有作成後にコピーしたコマンドを適切に変更して、Windowのコマンドプロンプトで実行します。
net use Z: \\<test-storagegw-eip>\test-storagegw-bucket /user:sgw-XXXXXXXX\smbguest
パスワードを聞かれるので、ファイル共有作成時に設定した、SMBの「ゲストパスワード」を入力します。
成功すると、「The command completed successfully.」と表示されます。

エクスプローラーを見ると、ZドライブにS3がマウントされていることを確認できました。

ファイル共有確認
WindowsでZドライブにファイルを作成します。

アカウントAのS3バケットを見ると、Windowsで作成されたファイルが反映されています。

次に、アカウントAのS3バケットにファイルを作成します。

しばらく待つと、WindowsのZドライブにファイルが反映されています。
ファイル共有作成時のTTLの設定どおり、最大5分の遅延があります。

CloudWatch確認
ゲートウェイとファイル共有の作成時に、CloudWatch Logsやアラームの作成も行ったので、ここで確認しておきます。
ゲートウェイ用と、ファイル共有用のロググループが作成されています。

ゲートウェイ用のロググループです。
セットアップ時のログが記録されています。


ファイル共有用のロググループです。
先ほど、WindowsからS3にファイル共有されたことを示すログが記録されています。
S3からWindwosへのファイル共有に関するログは記録されていないようです。

こちらはCloudWatchアラームです。
ファイル共有のIOや共有失敗に関するアラームが作成されているので、必要に応じて通知を受け取れるようにするとよいでしょう。
Storage GatewayのインスタンスへはSSH接続できます。
ただし、Storage Gateway用にカスタムされたものなので自由度は低そうですが、ここでネットワーク周りの設定や確認ができます。
ログインユーザは「admin」で、インスタンス作成時に作成したキーペアを使ってログインします。

まとめ
AWS Storage Gatewayを使用して、EC2に構築したWindowsに、他アカウントのS3バケットをドライブマウントすることができました。
作成するリソースが多く複雑なので、冒頭のような構成図を書き起こしてみることをお勧めします。
今回はAWS同士でしたが、オンプレミスや他ベンダーのクラウドサービスに立てたサーバから、S3をドライブマウントすることもできます。
ハイブリッドクラウド環境におけるデータ連携に非常に役立つ機能だと思います。