Elastic Beanstalk のセキュリティグループにルールを追加する方法

6649 ワード

Elastic Beanstalk は自動的にやってくれることが多い反面、環境内のリソースを変更する際には注意が必要です。[1]

[1] 環境を管理する - AWS Elastic Beanstalk

環境内にあるリソースを変更する場合は、必ず Elastic Beanstalk を使用してください。他のサービスのコンソール、CLI コマンド、または SDK を使用してリソースを変更した場合、Elastic Beanstalk ではこれらのリソースの状態を正確にモニタリングできなくなります。また、設定を保存することも、環境を確実に再現することもできなくなります。帯域外で変更を加えた場合は、環境を更新または終了する際も問題が発生することがあります。

環境内のリソースの変更の 1 つに、セキュリティグループのルールの変更があります。
環境に紐づく ELB のセキュリティグループを変更する手順については、AWS 公式ドキュメントに記載されています。[2]

[2] Elastic Beanstalk でロードバランサーにセキュリティグループを使用する

しかし、デフォルトで環境内に作成される EC2 用のセキュリティグループにルールを追加する方法については紹介されていなかったので、本記事で紹介したいと思います。

結論

Elastic Beanstalk の設定ファイルでセキュリティグループをカスタマイズ [3] することで実現可能です。
[3] Elastic Beanstalk 環境リソースの追加とカスタマイズ - AWS Elastic Beanstalk

前提

環境作成

まずは Elastic Beanstalk の環境をコンソール上で作成します。
プラットフォームは Node.js を選択し、サンプルアプリケーションで作成します。
その他の設定はすべてデフォルトのままです。

セキュリティグループの確認

環境内に作成された EC2 用のセキュリティグループのルールを確認しておきます。

現状では、HTTP のフルアクセスのみ許可されています。
この設定をセキュリティグループのコンソールから変更するのは非推奨なので、設定ファイルから変更することになります。

EB CLI の設定

前提に記載した [4] の AWS 公式ドキュメントから、Node.js サンプルアプリケーションの zip ファイルをダウンロードし、任意のディレクトリに展開します。
そのディレクトリをターミナルで開き、eb init で作成済みの環境と紐づけます。

セキュリティグループの設定

ここが本題です。
まず、.ebextensions ディレクトリに、任意の名前の config ファイルを作成します。
今回は ec2sg.config というファイル名で作成しました。
続いて、このファイルに以下のように記述します。

ec2sg.config
Resources:
  AWSEBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties: 
      SecurityGroupIngress: 
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupId: <セキュリティグループ ID>

AWSEBSecurityGroup は Elastic Beanstalk の裏側で CloudFormation によって自動的に作成された EC2 用のセキュリティグループの論理 ID です。
CloudFormation に慣れている方ならもうお分かりかと思いますが、上記の記述は CloudFormation テンプレートと同様の記述です。

したがって、Elastic Beanstalk 環境内のリソースを変更する場合は、以下の AWS 公式ドキュメント [6] に記載されている論理 ID をもとに、設定ファイルを記述すればよさそうです。

[6] Elastic Beanstalk が環境向けに作成するリソースを変更する - AWS Elastic Beanstalk

今回は、デフォルトの HTTP (80) に加えて、HTTPS (443) と、特定のセキュリティグループからの HTTP (80) 通信を許可するように設定してみました。
この設定だと HTTP はフルオープンなので、セキュリティグループでの設定は無意味ですが、検証用なので、必要に応じて変更してください。

デプロイ

デフォルトアプリに ec2sg.config のみ追加した状態で、eb deploy を実行してデプロイします。

デプロイが完了したら、EC2 のセキュリティグループを確認します。

デプロイ前と同じセキュリティグループにルールが追加されていることが確認できます。
これでデフォルトのセキュリティグループにルールを追加することができました。

注意点

今回はすべてデフォルトの設定で環境を作成したため、先述の設定ファイルの内容で変更できましたが、ネットワーク設定で VPC を変更している場合は、VpcId の記述も必要です。

ec2sg.config
Resources:
  AWSEBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties: 
      SecurityGroupIngress: 
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupId: <セキュリティグループ ID>
      VpcId: <VPC ID> ← ここ!

ちなみに、デフォルト設定で VPC を記述したらエラーになったので、デフォルト設定では VPC の記述は不要のようでした。

まとめ

今回は、Elastic Beanstalk の環境内に作成される デフォルトの EC2 用のセキュリティグループにルールを追加する方法について紹介しました。
環境内のリソースも設定ファイルでカスタマイズできることが分かったので、使いこなせれば応用も効きそうです。
気になった方は試してみてください。

今回の内容がどなたかの参考になれば幸いです。

参考資料

[1] 環境を管理する - AWS Elastic Beanstalk
[2] Elastic Beanstalk でロードバランサーにセキュリティグループを使用する
[3] Elastic Beanstalk 環境リソースの追加とカスタマイズ - AWS Elastic Beanstalk
[4] チュートリアルおよびサンプル - AWS Elastic Beanstalk
[5] Elastic Beanstalk コマンドラインインターフェイス (EB CLI) の使用 - AWS Elastic Beanstalk
[6] Elastic Beanstalk が環境向けに作成するリソースを変更する - AWS Elastic Beanstalk