AWS re:Postを使用することにより、以下に同意したことになります 利用規約

AWSEBSecurityGroup の削除に失敗したときに、AWS Elastic Beanstalk 環境を終了または再構築する方法を教えてください。

所要時間3分
0

AWS Elastic Beanstalk 環境を終了または再構築しようとすると、「スタックを削除できませんでした: 次のリソースを削除できませんでした: [AWSEBSecurityGroup]。」というエラーが表示されます。

簡単な説明

AWSEBSecurityGroup は Elastic Beanstalk を介して基盤となる AWS CloudFormation スタックが作成した Amazon Elastic Compute Cloud (Amazon EC2) セキュリティグループです。AWSEBSecurityGroup を Elastic Beanstalk 環境外で作成された Elastic Network Interface (ENI) またはセキュリティグループが使用している場合、環境の終了または再構築が失敗してエラーを返すことがあります。

注: Elastic Beanstalk コンソールElastic Beanstalk コマンドラインインターフェイス (EB CLI)、または AWS コマンドラインインターフェイス (AWS CLI) を使用して、Elastic Beanstalk が作成したリソースを管理することをお勧めします。

解決方法

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

このエラーを解決するには、次のいずれかのオプションを選び実行します。

  • (オプション A) AWS CloudFormation コンソールまたは AWS CLI のいずれかで Elastic Beanstalk 環境が作成した AWS CloudFormation スタックを削除してから、Elastic Beanstalk 環境を終了します。
  • (オプション B) Elastic Beanstalk セキュリティグループから依存オブジェクトを削除してから、Elastic Beanstalk 環境を終了します。

重要: AWS CLI でのスタック名、環境名、AWS リージョン、環境に固有のその他の変数には、正しい値を入力してください。

(オプション A) AWS CloudFormation コンソールからスタックを削除する

AWS CloudFormation コンソールまたは AWS CLI のいずれかからスタックを削除できます。

AWS CloudFormation コンソール:

1.    AWS CloudFormation コンソールを開きます。

2.    Stack Name 列で、削除に失敗したスタックを選択します。

注: スタックの Status 列に [DELETE_FAILED] と表示されます。

3.    [Actions] メニューから [Delete Stack] を選択します。

4.    [Delete Stack] ポップアップウィンドウで [AWSEBSecurityGroup] を選択し、[Yes, Delete] をクリックします。

重要: セキュリティグループを必ず削除してください。スタックを削除しても、AWSEBSecurityGroup は自動的には削除されません。 他の依存リソースが原因で環境の終了に失敗した場合は、DELETE_FAILED 状態の適切なリソースを [Delete Stack] (スタックの削除) ポップアップウィンドウから選択します。その後、[Yes, Delete] (はい、削除します) を選択します。

5.    Elastic Beanstalk 環境を終了または再構築します。

AWS CLI:

1.    AWS CloudFormation スタックを削除するには、次のコマンドを実行します。

aws cloudformation delete-stack --stack-name awseb-e-ztrauxujck-stack --retain-resources "AWSEBSecurityGroup" --region us-east-1

2.    Elastic Beanstalk 環境を終了するには、次のコマンドを実行します。

aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1

3.    Elastic Beanstalk 環境を再構築するには、次のコマンドを実行します。

aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1

(オプション B) Elastic Beanstalk セキュリティグループの依存オブジェクトを見つけて削除する

AWSEBSecurityGroup の削除を妨げている依存 Elastic Network Interface または依存セキュリティグループを見つけるには、Amazon EC2 コンソールまたは AWS CLI で次の手順を実行します。

Amazon EC2 コンソール:

1.    AWSEBSecurityGroup のセキュリティグループ ID を Elastic Beanstalk イベントストリームのエラーメッセージから取得します。

2.    [Amazon EC2 コンソール] を開きます。

3.    ナビゲーションペインで Security Groups をクリックし、次にステップ 1 で取得した AWSEBSecurityGroup IDを選択します。

4.    [Actions] (アクション) を選択し、[Delete Security Group] (セキュリティグループの削除) を選択して、AWSEBSecurityGroup への依存関係を見つけます。

5.    [Delete Security Groups] ポップアップウィンドウで、[View your associated instance] をクリックします。
[Actions] (アクション) を選択してから、[Networking] (ネットワーキング) を選択します。
[Change Security Group] (セキュリティグループの変更) を選択します。
[AWSEBSecurityGroup ID] と [Assign Security Groups] (セキュリティグループの割り当て) チェックボックスをオフにします。

6.    [Delete Security Groups] (セキュリティグループの削除) ポップアップウィンドウに戻り、[View your referencing security groups] (参照するセキュリティグループを表示する) を選択します。
AWSEBSecurityGroup ID の関連付けを削除するには、[Actions] (アクション) を選択してから、要件に応じて [Edit inbound rules] (インバウンドルールを編集) または [Edit outbound rules] (アウトバウンドルールを編集) を選択します。

7.    Elastic Beanstalk 環境を終了または再構築します。

AWS CLI:

1.    AWSEBSecurityGroup のセキュリティグループ ID を Elastic Beanstalk イベントストリームのエラーメッセージから取得します。

2.    次の bash スクリプトを sg_dependency.sh として保存します。

#!/bin/bash
SecurityGroupID=$1
Region=$2
DependentENI=$(aws ec2 describe-network-interfaces --filters Name=group-id,Values=[$SecurityGroupID] --region $Region | jq '.NetworkInterfaces[].NetworkInterfaceId')
DependentSGingress=$(aws ec2 describe-security-groups --filters Name=ip-permission.group-id,Values=[$SecurityGroupID] --region $Region | jq '.SecurityGroups[] .GroupId')
DependentSGegress=$(aws ec2 describe-security-groups --filters Name=egress.ip-permission.group-id,Values=[$SecurityGroupID] --region $Region | jq '.SecurityGroups[] .GroupId')
echo "The dependent ENI is $DependentENI"
echo "The security group id with a dependency in ingress rule : $DependentSGingress"
echo "The security group id with a dependency in egress rule :  $DependentSGegress"

3.    jq ウェブサイトから jq utility をインストールします。

4.    Elastic Network Interface ID、セキュリティグループ ID、またはその両方を取得するには、次のコマンドを実行します。

./sg_dependency.sh sg-111aaa22 us-east-1

注: sg-111aaa22AWSEBSecurityGroup ID に置き換えます。us-east-1 をお使いの AWS リージョンに置き換えます。

5.    ステップ 4 で取得した Elastic Network Interface ID に接続しているセキュリティグループを見つけるには、次のコマンドを実行します。

aws ec2 describe-network-interface-attribute --network-interface-id eni-1099d901 --attribute groupSet

6.    AWSEBSecurityGroup ID をデタッチするには、次のコマンドを実行します。

重要: このコマンドで AWSEBSecurityGroup ID を必ず除外し、他のセキュリティグループ ID を含めて、ネットワークインターフェイスに接続したままにしてください。

aws ec2 modify-network-interface-attribute --network-interface-id eni-1099d901 --groups sg-030644d6c95b6470a sg-d34a33a8 sg-059c081ab30c3e38e sg-0e4eabc747368e6c9

重要: コマンド出力が「ModifyNetworkInterfaceAttribute オペレーションを呼び出すときにエラーが発生しました (AuthFailure): 指定されたリソースにアクセスするためのアクセス許可がありません」というエラーを返す場合は、その Elastic Network Interface を作成した AWS のサービスから AWSEBSecurityGroup を削除します。

7.    describe-security-groups コマンドを実行して、ステップ 4 で取得した依存セキュリティグループのすべての受信ルールおよび送信ルールを一覧表示します。

8.    ステップ 7 からの出力に基づいて、revoke-security-group-ingress または revoke-security-group-egress コマンドを実行します。

例えば、AWSEBSecurityGroup ID が sg-111aaa22 であり、ステップ 8 の出力にはそのセキュリティグループ ID が受信ルールに含まれている場合は、次のコマンドを実行します。

aws ec2 revoke-security-group-ingress --group-id sg-0018a2fbdcd5797ea --ip-permissions '[{"PrefixListIds":[],"FromPort":0,"IpRanges":[],"ToPort":65535,"IpProtocol":"tcp","UserIdGroupPairs":[{"UserId":"123456789102","GroupId":"sg-111aaa22"}],"Ipv6Ranges":[]}]'

注: UserId は AWS アカウント ID です。

9.    Elastic Beanstalk 環境を終了するには、次のコマンドを実行します。

aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1

10.    Elastic Beanstalk 環境を再構築するには、次のコマンドを実行します。

aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1

関連情報

トラブルシューティング (Elastic Beanstalk)