Elastic Beanstalk のセキュリティグループにルールを追加する方法
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 のドキュメント [4] にある Node.js のサンプルアプリを使用
[4] チュートリアルおよびサンプル - AWS Elastic Beanstalk - Elastic Beanstalk コマンドラインインターフェイス (EB CLI) [5] をインストール済み
[5] Elastic Beanstalk コマンドラインインターフェイス (EB CLI) の使用 - AWS Elastic Beanstalk
環境作成
まずは Elastic Beanstalk の環境をコンソール上で作成します。
プラットフォームは Node.js を選択し、サンプルアプリケーションで作成します。
その他の設定はすべてデフォルトのままです。
セキュリティグループの確認
環境内に作成された EC2 用のセキュリティグループのルールを確認しておきます。
現状では、HTTP のフルアクセスのみ許可されています。
この設定をセキュリティグループのコンソールから変更するのは非推奨なので、設定ファイルから変更することになります。
EB CLI の設定
前提に記載した [4] の AWS 公式ドキュメントから、Node.js サンプルアプリケーションの zip ファイルをダウンロードし、任意のディレクトリに展開します。
そのディレクトリをターミナルで開き、eb init
で作成済みの環境と紐づけます。
セキュリティグループの設定
ここが本題です。
まず、.ebextensions
ディレクトリに、任意の名前の 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
の記述も必要です。
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
Discussion