Elastic Beanstalk .NETにおけるWindows Firewall追加ポート許可の方法

AWS Elastic Beanstalk .NETにてWindows Firewallの追加ポート許可をしたかったのですが、少々ハマりましたので対応方法をご紹介します。
2018.05.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちはコカコーラ大好きカジです。

AWS Elastic Beanstalk .NETにてWindows Firewallの追加ポート許可をしたかったのですが、少々ハマりましたので対応方法をご紹介します。

対処法

以下のebextensionでPowershellスクリプトを作成し、スクリプト実行させて変更します。Settingsのところでポートを指定しているので修正しご利用ください。

Firewallのルール追加(New-NetFirewallRule)のみのスクリプトで行なった場合に同じFirewallルールがデプロイ(アプリケーションバンドルの変更)毎に追加されてしまいました。ルール数がどんどん増えてしまったので、参考元に記載したサイトを参考にさせていただきました。 PowershellでFirewallルールの追加すると同じ名前で複数登録されることを知りませんでした。

ebextensions

デプロイするアプリケーションのzipファイルをBeanstalkでは「アプリケーションバンドル」と呼びます。

このアプリケーションバンドル内のルート・ディレクトリ直下に.ebextensionsというディレクトリを作り、その内部に(任意の名前).configというファイルを置いておくことにより、アプリケーション側からElastic Beanstalkに対して、設定の指示を行うことができます。

今回は、Elastic Beanstalkで起動するEC2インスタンス内で、Powershellスクリプトファイルを作成させて、そのスクリプトファイルを実行させています。 TCP 8080ポートを開けるようにしています。

Firewallの追加ポート許可するebextensionファイル

$ cat 01-fw.config
files:
  "C:\\classmethod\\Firewall-open.ps1":
    content: |
      ## Settings
      $firewallPort = "8080"
      $firewallRuleName = "Open port 8080"

      ## Firewall Open Port Setup
      write-host "Checking for '$firewallRuleName' firewall rule on port '$firewallPort' now...."
      if ($(Get-NetFirewallRule –DisplayName $firewallRuleName | Get-NetFirewallPortFilter | Where { $_.LocalPort -eq $firewallPort }))
      {
          write-host "Firewall rule for '$firewallRuleName' on port '$firewallPort' already exists, not creating new rule"
      }
      else
      {
          write-host "Firewall rule for '$firewallRuleName' on port '$firewallPort' does not already exist, creating new rule now..."
          New-NetFirewallRule -DisplayName $firewallRuleName -Direction Inbound -Profile Domain,Private,Public -Action Allow -Protocol TCP -LocalPort $firewallPort -RemoteAddress Any
          write-host "Firewall rule for '$firewallRuleName' on port '$firewallPort' created successfully"
      }

commands:
    00_Firewall_open:
      command: powershell -NoProfile -ExecutionPolicy Bypass -file C:\\classmethod\\Firewall-open.ps1

検証した環境

AWS Elastic Beanstalk .NET IIS 8.5 running on 64bit Windows Server 2012 R2/1.2.0

実行結果

Elastic BeanstalkのEC2側でFirewallが有効になっていることを確認します。

まとめ

検証の際にFirewallルールが増え続けた時は驚きました。わかってしまえば簡単ですね。どなたかの参考になれば幸いです。

参考元

Duplicated Windows firewall rules (Netsh AdvFirewall firewall) - Stack Overflow