【AWS Storage Gateway】S3バケットをEC2 WindowsOSにSMBマウントする方法

AWS

こんにちは。ますのです。
各種データのバックアップですが、いっそのことS3バケットに格納出来ればリソース削減になるのでは??となりまして、WindowsサーバにS3バケットをマウントする方法を模索しました!Linuxの場合はEFS使えば良さそうですので、需要はWindowsになるのかなぁと感じた次第です。

頻繁に取り出すようなデータではなく、障害発生時の最終防衛ライン的な立ち位置で扱うデータが対象です。データ転送速度は若干落ちますがわたしとしては許容範囲な結果でしたので継続利用です。

やりたいこと&構成図

・既に作成済みのEC2:WindowsServerから、内部のみに公開しているS3バケットに対してデータを配置する

マウント先のS3バケットを作成する

AWS管理コンソール>S3>バケットを作成するをクリックする

名称に関しては自身で分かるものを設定します。Windowsサーバ上からアクセスする際に利用する名称となります。

今回の構成は社内用にのみ利用するStorageGatewayとなります。
DirectConnect利用をしているため、ブロックパブリックアクセスのバケット設定は「パブリックアクセスをすべてブロック」にしました。

もし外部やIGWからのアクセスも許可したい場合は各自設定をします。

 

Storage Gatewayの作成

続いてストレージゲートウェイを作成します。

  1. ゲートウェイの種類を選択:ファイルゲートウェイを選択する
  2. ホストプラットフォームの選択:Amazon EC2を選択し、「インスタンスの起動」をクリックする
  3. ストレージゲートウェイを動かすためのEC2を作成する
    ・インスタンスタイプ:
    AWSの推奨は「m4.xlarge」ですが、今回は「t3.large」で設定して動作を確認しました。
    「t2.micro」ではストレージゲートウェイが実行中になりませんでした
    「t2.medium」では当初は実行中になりましたが、ストレージゲートウェイのバージョンを上げたところメモリ不足でエラーとなったので、推奨よりちょい下げで様子見中です。
    ・ストレージ:
    ルートボリューム以外に、キャッシュデータを格納するボリュームを別途アタッチする必要があります。推奨では150GBとなっておりますが、頻繁にアクセスしない想定のため「100GB」で様子見です。
    ※ルート:80GB EBS:100GB で作成

  4. サービスエンドポイントの選択:パブリックを選択し次へをクリックする

    VPCを選択してエンドポイントを作成したのでありますが、S3のエンドポイントではDNS名が作成出来なかったのです。。。
    今回は取り急ぎパブリックにて回避することを決断したのであります。
  5. ートウェイに接続:③で作成したEC2のIPアドレスを入力する※今回はローカル環境のみで利用のため、プライベートIPを入力しました。
  6. ゲートウェイのアクティブ化:タイムゾーンとゲートウェイ名を設定し、ゲートウェイのアクティブ化を実行する
  7. ゲートウェイのアクティブ化をする
    ローカルディスクの準備に時間がかかるため、作成まで少し時間がかかります。
    ③のEC2インスタンス作成時にルートボリュームとは別のローカルストレージを作成し忘れていた場合、「ローカルストレージを割り当てる必要があります」と警告文が表示されます。後ほどキャッシュ用のローカルストレージを作成しましょう。

    インスタンスタイプのメモリやCPUなどのリソース不足があった場合、この時点でアクティブ化に失敗したであります!
    時間が経ってもステータスが「実行中」にならない場合はインスタンスタイプを少し良いものに付け替えてみると解決するかもです。

ファイル共有の作成

続いてファイル共有を作成します。このファイル共有設定によって、ストレージゲートウェイとS3バケットを紐づけます。

  1. 管理コンソール>Storage Gateway>ゲートウェイ>作成したゲートウェイを選択>ファイルの共有をクリック
  2. ファイル共有の設定:以下の3つを入力して次へをクリック
    ・先程作成した「マウントしたいAmazon S3バケット名」を入力
    ・サーバーメッセージブロック(SMB)を選択、
    ・先ほど作成したゲートウェイを選択
  3. Amazon S3でファイルを保存する方法の設定:デフォルト設定で次へをクリック
    ・新しいオブジェクトのストレージクラス:S3スタンダード
    ・オブジェクトメタデータ:MIMEの種類の推測、バケット所有者に完全なコントロールを付与にチェック
    ・S3バケットへのアクセス:新しいIMAロールを作成する
  4. SMB共有の設定:ゲストアクセスを選択>閉じる>ファイル共有の作成をクリック
  5. ファイル共有の作成が完了します。

ゲストアクセスの場合CLIでしか作成出来ないバグを確認。2019/7月時点では解消されましたが、コマンドライン上から作成する場合は下記を参考に実行します。

$ aws storagegateway create-smb-file-share –client-token <任意の文字列> –gateway-arn <ファイルゲートウェイの ARN> –role <IAM ロールの ARN > –location-arn arn:aws:s3:::<S3 バケット名> –default-storage-class S3_STANDARD –no-requester-pays –guess-mime-type-enabled –authentication GuestAccess –object-acl bucket-owner-full-control –no-smbacl-enabled

参考:create-smb-file-share — AWS CLI 1.16.186 Command Reference 

ファイル共有にアクセスするゲストアカウントの作成

続いてファイル共有にSMBアクセスする際のユーザ設定を行います。
ドメイン結合が出来ない環境だったので今回はゲストアカウントという方法にて対応しました。

2020/9/26追記
ドメイン結合が出来ない理由が、GatewayInstanceのDNS設定を変更していない点だとわかりました。
ドメイン結合で「ドメインを結合できませんでした」「結合失敗(ネットワークエラー)」となっている場合はこちらの記事でいけるかもです。
【StorageGateway】ドメインを結合できない?DNS設定で解消!
  1. 管理コンソール>Storage Gateway>ゲートウェイ>作成したゲートウェイを選択>アクション>SMB設定の編集をクリックします。
  2. ゲストアクセス設定:Windowsからアクセスする際のパスワードを設定し、保存をクリックし完了です。

WindowsサーバからS3バケットへアクセス出来るか確認する

Windowsサーバにマウントするために、コマンドプロンプトより以下のコマンドを実行します。

Zドライブにゲストアカウントでマウントさせる場合:
net use Z: \\(EC2:IPアドレス)\(S3バケット名) /user:(ゲートウェイID)\smbguest

例)
net use Z: \\192.168.11.22\s3-bucket /user:sgw-AABB1122\smbguest

以上でアクセスが出来るようになります!
定期バックアップをrobocopyで実行したりする際にも利用出来るので、何かと使いみちはあるかなぁと思う今日このごろ。ただ、LinuxですとEFSが出てきているのでWindowsのEC2でも使いやすいものが出るor出ているのかもしれないですね。

AWS側のバグに泣かされましたが、1週間程で直してくれたので良しです!S3で出来ることがないかもう少し考えていければいいなと思います。

最新情報をチェックしよう!