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

最終更新日: 2019 年 6 月 7 日

AWS Elastic Beanstalk 環境を終了または再構築しようとすると、「Stack deletion failed: The following resource(s) failed to delete: [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 が作成したリソースを管理することをお勧めします。

解決方法

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

  • (オプション 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:

以下の手順を実行するには 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 ユーティリティ をインストールします。

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 に接続しているセキュリティグループを見つけるには、describe-network-interface-attribute コマンドを実行します。

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

6.    AWSEBSecurityGroup ID をデタッチするには、modify-network-interface-attribute コマンドを実行します。

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

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

重要: コマンド出力が「An error occurred (AuthFailure) when calling the ModifyNetworkInterfaceAttribute operation: You don't have permission to access the specified resource」というエラーを返す場合は、その 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

この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合