AWS Storage Gatewayを使用してEC2 WindowsにS3バケットをクロスアカウントでドライブマウントする
AWS Storage Gatewayを使用して、EC2に構築したWindowsに、他アカウントのS3バケットをドライブマウントしてみました。
登場するリソースが多く設定も複雑なので、まずは今回作成する構成図を示します。
アカウントAにStorage Gatewayを立てて、アカウントBのWindowからStorage Gateway経由でS3をドライブマウントします。
AWS Storage Gatewayとは
AWS Storage Gateway は、オンプレミスにあるファイルサーバなどのストレージとAmazon S3の大容量ストレージを密接に連携させ、堅牢かつ可用性の高いストレージを構築することが可能になるサービスです。
AWS Storage Gatewayの構築
構築はアカウント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や共有失敗に関するアラームが作成されているので、必要に応じて通知を受け取れるようにするとよいでしょう。
SSH接続
Storage GatewayのインスタンスへはSSH接続できます。
ただし、Storage Gateway用にカスタムされたものなので自由度は低そうですが、ここでネットワーク周りの設定や確認ができます。
ログインユーザは「admin」で、インスタンス作成時に作成したキーペアを使ってログインします。
まとめ
AWS Storage Gatewayを使用して、EC2に構築したWindowsに、他アカウントのS3バケットをドライブマウントすることができました。
作成するリソースが多く複雑なので、冒頭のような構成図を書き起こしてみることをお勧めします。
今回はAWS同士でしたが、オンプレミスや他ベンダーのクラウドサービスに立てたサーバから、S3をドライブマウントすることもできます。
ハイブリッドクラウド環境におけるデータ連携に非常に役立つ機能だと思います。