Elastic Beanstalk 環境に紐づくセキュリティグループを削除したことによるエラーの解決策を教えてください

2022.07.13

困っていた内容

Elastic Beanstalk 環境に、カスタムのセキュリティグループを追加していました。
カスタムのセキュリティグループが不要になったので、セキュリティグループのコンソール上から削除したところ、Elastic Beanstalk 環境で以下のエラーが発生してしまい、環境の設定変更ができなくなってしまいました。

Failed Environment update activity. Reason: Configuration validation exception: Invalid option value: ‘sg-0123456789’ (Namespace: ‘aws:autoscaling:launchconfiguration’, OptionName: ‘SecurityGroups’): The security group having id ‘sg-0123456789’ does not exist

上記エラーの解決策を教えてください。

どう対応すればいいの?

update-environment コマンドを以下のオプションで実行してください。

aws elasticbeanstalk update-environment \ 
--environment-name {your-environment-name} \ 
--option-settings Namespace=aws:autoscaling:launchconfiguration,OptionName=SecurityGroups,Value=""

更新前の起動設定または起動テンプレートには、削除されたカスタムのセキュリティグループが設定されているため、実際の環境との不一致が発生しています。
上記コマンドを実行することで、Elastic Beanstalk 環境に紐づく起動設定または起動テンプレートが更新され、古いカスタムのセキュリティグループの設定が削除されます。
これにより、実際の環境と整合性のある状態となります。

やってみた

実際にエラーを発生させ、update-environment でエラーが解消されることを確認します。
なお、検証には EB CLI を利用します。

環境準備

まずはデフォルトのアプリケーションで Elastic Beanstalk 環境を起動します。

続いて、カスタムのセキュリティグループを EC2 コンソール上で作成します。
特にインバウンドルールは設定せず、名前と説明だけ入力して作成します。

Elastic Beanstalk 環境の起動後、AWS 公式ドキュメントから、Node.js のサンプルアプリケーションをダウンロードし、サンプルアプリケーションのルートディレクトリで eb init を実行します。

eb init --profile makoto

リージョンを設定する必要があるので、9) ap-northeast-1 : Asia Pacific (Tokyo) を選択します。

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
18) eu-north-1 : EU (Stockholm)
19) eu-south-1 : EU (Milano)
20) ap-east-1 : Asia Pacific (Hong Kong)
21) me-south-1 : Middle East (Bahrain)
22) af-south-1 : Africa (Cape Town)
(default is 3): 9

作成済みの Elastic Beanstalk 環境 を選択します。

Select an application to use
1) test
2) [ Create new Application ]
(default is 2): 1

最後に CodeCommit が設定されていない旨が表示されますが、今回は不要なのでスキップします。

Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization

これで、ローカルから eb deploy することで、カスタムのセキュリティグループを追加することができるようになりました。
続いて、カスタムのセキュリティグループを追加するために、.ebextensions 配下に testsg.config というファイルを追加します。
AWS ナレッジセンター の内容を参考に、testsg.config ファイルには以下の内容を記載します。

option_settings:
  - namespace: aws:autoscaling:launchconfiguration
    option_name: SecurityGroups
    value: custom-sg-id

custom-sg-id の部分には、作成済みのカスタムのセキュリティグループ ID を記載して保存します。

eb deploy でデプロイする前に、現在の Elastic Beanstalk 環境に紐づくセキュリティグループを確認しておきます。
Elastic Beanstalk 環境に紐づく起動テンプレートを見ると、バージョン 1 のテンプレートに Elastic Beanstalk によって自動作成されたセキュリティグループが 1 つだけ設定されています。

デプロイ後に新しい起動テンプレートバージョンが作成され、セキュリティグループは 2 つになりますので、実際に確認してみます。
ローカルから eb deploy を実行します。

eb deploy

デプロイ完了後、再度起動テンプレートを確認すると、バージョン 2 のテンプレートが作成されています。
また、セキュリティグループにカスタムのセキュリティグループが追加されていることも確認できました。

なお、起動設定や VPC 設定を変更する場合、Elastic Beanstalk 環境内のすべての EC2 インスタンスが置換される点にはご注意ください。

AWS 公式ドキュメントより

起動設定または VPC 設定を変更する設定の変更では、環境内のすべてのインスタンスを終了し置き換える必要があります。

これで環境が準備できました。

カスタムのセキュリティグループを削除してみる

環境が準備できたので、エラーを発生させるために、カスタムのセキュリティグループを削除してみます。
削除するためには、ENI からセキュリティグループを外す必要があるので、まずは ENI の設定変更でカスタムのセキュリティグループを削除します。

ENI での削除後、カスタムのセキュリティグループ自体を削除します。

この状態で Elastic Beanstalk 環境から設定変更を実施しようとすると、エラーが発生します。

Elastic Beanstalk 環境に紐づくカスタムのセキュリティグループを削除したことで、実際の環境との不一致が発生している状態です。
それではこのエラーを解消するために、CloudShell から update-environment を実行してみます。

aws elasticbeanstalk update-environment \ 
--environment-name Test-env \ 
--option-settings Namespace=aws:autoscaling:launchconfiguration,OptionName=SecurityGroups,Value=""

コマンド実行後、Elastic Beanstalk 環境が更新されます。
更新後、起動テンプレートを確認すると、バージョン 3 のテンプレートが作成されています。
また、バージョン 2 では 2 つあったセキュリティグループが 1 つに戻っています。

カスタムのセキュリティグループが update-environment を実行したことで削除され、実際の環境と整合性のある状態に更新されました。
この状態であれば、Elastic Beanstalk 環境で先ほどのエラーは発生せず、設定変更が可能です。

補足

update-environment コマンド実行時に Value="" とすることで、Elastic Beanstalk によって自動作成されたセキュリティグループのみが起動テンプレートに設定されました。
もし、カスタムのセキュリティグループが複数あり、そのうちの 1 つだけを削除したい場合には、残したいセキュリティグループ ID を Value に指定してください。

aws elasticbeanstalk update-environment \ 
--environment-name Test-env \ 
--option-settings Namespace=aws:autoscaling:launchconfiguration,OptionName=SecurityGroups,Value="sg-000111222"

参考資料