はじめに

ご覧いただき、ありがとうございます。

EC2 インスタンスでアプライアンスを構成し、S3 ファイルゲートウェイ(Storage Gateway)をアクティベートしたい場合、
アプライアンスを構成する EC2 インスタンスは、AWS マネジメントコンソールから簡単に起動し、設定できるようになっています。

しかしながら、こちらで起動した EC2 インスタンスは、アクティベーションのために
パブリック IP アドレスが付与されており、また、セキュリティグループで、全ての接続元(0.0.0.0/0)から 80 ポートのインバウンドのアクセスが許可されてしまっています。

上記の起動方法は簡単でありますが、やはり、このような設定がされている状態は避けたいです。

回避策として、アプライアンスを構成する EC2 インスタンスからアクティベーションキーを取得し、S3 ファイルゲートウェイをアクティベートするという方法があります。

アクティベーションキーは、EC2 インスタンスへ HTTP リクエストする形で取得します。
そのため、例えば、アプライアンスを構成する EC2 インスタンスと同じサブネット内に
別の EC2 インスタンスを作成し、そのインスタンスからキーを取得するといったことが可能となるため
パブリック IP アドレス及び 0.0.0.0/0 の許可が不要となります。

設定をカスタマイズし EC2 インスタンスを起動する

まず、アプライアンスを構成する EC2 インスタンスを起動します。

以下のとおりに、設定をカスタマイズします。

パブリック IP の自動割り当て

無効化にします。

セキュリティグループ

インバウンドの 80 ポートについて、キーを取得するための HTTP リクエストを実行するホストを許可します。
今回は同じサブネットに起動した別 EC2 インスタンスから取得するため、その EC2 インスタンスにアタッチしているセキュリティグループを許可します。

そのほかは利用するファイル共有のプロトコルに応じて設定します。

--------------------------------------------
|          DescribeSecurityGroups          |
+-------------+----------------+-----------+
|  FromPort   |  IpProtocol    |  ToPort   |
+-------------+----------------+-----------+
|  80         |  tcp           |  80       |
+-------------+----------------+-----------+
||            UserIdGroupPairs            ||
|+-----------------------+----------------+|
||        GroupId        |    UserId      ||
|+-----------------------+----------------+|
||  sg-xxxxxxxxxxxxxxxxx |  xxxxxxxxxxxx  || # キー取得用 EC2 インスタンスのセキュリティグループ
|+-----------------------+----------------+|
+-------------+----------------+-----------+
|  FromPort   |  IpProtocol    |  ToPort   |
+-------------+----------------+-----------+
|  139        |  udp           |  139      |
+-------------+----------------+-----------+
||            UserIdGroupPairs            ||
|+-----------------------+----------------+|
||        GroupId        |    UserId      ||
|+-----------------------+----------------+|
||  sg-xxxxxxxxxxxxxxxxx |  xxxxxxxxxxxx  ||
|+-----------------------+----------------+|
+-------------+----------------+-----------+
|  FromPort   |  IpProtocol    |  ToPort   |
+-------------+----------------+-----------+
|  139        |  tcp           |  139      |
+-------------+----------------+-----------+
||            UserIdGroupPairs            ||
|+-----------------------+----------------+|
||        GroupId        |    UserId      ||
|+-----------------------+----------------+|
||  sg-xxxxxxxxxxxxxxxxx |  xxxxxxxxxxxx  ||
|+-----------------------+----------------+|
+-------------+----------------+-----------+
|  FromPort   |  IpProtocol    |  ToPort   |
+-------------+----------------+-----------+
|  445        |  tcp           |  445      |
+-------------+----------------+-----------+
||            UserIdGroupPairs            ||
|+-----------------------+----------------+|
||        GroupId        |    UserId      ||
|+-----------------------+----------------+|
||  sg-xxxxxxxxxxxxxxxxx |  xxxxxxxxxxxx  ||
|+-----------------------+----------------+|

アクティベーションキーを取得する

EC2 インスタンスへ接続し、ドキュメントを参考に、HTTP リクエストを実行します。
今回は Windows で実行していますが、上記にあるとおり、Linux も問題ないです。

PS C:\Users\Administrator> function Get-ActivationKey {
>>   [CmdletBinding()]
>>   Param(
>>     [parameter(Mandatory=$true)][string]$IpAddress,
>>     [parameter(Mandatory=$true)][string]$ActivationRegion,
>>     [parameter(Mandatory=$true)][string]$GatewayType
>>   )
>>   PROCESS {
>>     $request = Invoke-WebRequest -UseBasicParsing -Uri "http://$IpAddress/?activationRegion=$ActivationRegion&gatewayType=$GatewayType" -MaximumRedirection 0 -ErrorAction SilentlyContinue
>>     if ($request) {
>>       $activationKeyParam = $request.Headers.Location | Select-String -Pattern "activationKey=([A-Z0-9-]+)"
>>       $activationKeyParam.Matches.Value.Split("=")[1]
>>     }
>>   }
>> }
PS C:\Users\Administrator> Get-ActivationKey -IpAddress 10.0.0.105 -ActivationRegion ap-northeast-1 -GatewayType FILE_S3
XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

アクティベーションキーを設定する

以下の画面で、取得したアクティベーションキーを設定します。

「正常にアクティブ化されました」と表示され、「ゲートウェイの設定」の画面に進めましたら、成功となります。

終わりに

今回は、キー取得用として EC2 インスタンスを起動しましたが
実際は、S3 バケットをマウントするクライアントが存在するはずであるため、そのクライアントから取得すると簡単であると思います。

最後までご覧いただき、ありがとうございました。