yuj1osm's tech blog

クラウドやセキュリティなど

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.amazon.com

AWS Storage Gatewayの構築

構築はアカウントAでの作業です。

バケット作成

ドライブマウントするバケットを作成します。
バケット名:test-storagegw-bucket

セキュリティグループ作成

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

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

  • 「アカウントA」のVPCのIP CIDR→HTTPS(443)

エンドポイント作成

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をドライブマウントすることもできます。
ハイブリッドクラウド環境におけるデータ連携に非常に役立つ機能だと思います。