AWSebSecurityGroup が削除に失敗した場合、Elastic Beanstalk 環境を終了または再構築する方法を教えてください。
AWS Elastic Beanstalk 環境を終了または再構築すると、次のエラーが表示されます。 「スタックの削除に失敗しました: 次のリソースを削除できませんでした:[AWSEBSecurityGroup]。」
簡単な説明
AWSEBSecurityGroup は、基盤となる AWS CloudFormation スタックが Elastic Beanstalk を通じて作成する Amazon Elastic Compute Cloud (Amazon EC2) セキュリティグループです。Elastic Beanstalk 環境の外部で作成された エラスティックネットワークインターフェイス またはセキュリティグループが AWSebSecurityGroup を使用している場合、環境を終了または再構築するとその環境は機能しなくなります。
**注:**Elastic Beanstalk が作成するリソースを管理するには、Elastic Beanstalk コンソール、Elastic Beanstalk コマンドラインインターフェイス (EB CLI) 、または AWS コマンドラインインターフェイス (AWS CLI) のいずれかを使用することがベストプラクティスです。AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用しているようにしてください。
解決策
この問題を解決するには、次のタスクのいずれかを実行します。
- AWS CloudFormation コンソールまたは AWS CLI のいずれかを使用して、Elastic Beanstalk 環境が作成した CloudFormation スタックを削除します。次に、Elastic Beanstalk 環境を終了または再構築します。
- Elastic Beanstalk セキュリティグループから依存するオブジェクトを削除します。次に、Elastic Beanstalk 環境を終了または再構築します。
**注:**次の AWS CLI コマンドでは、スタック名、環境名、AWS リージョン、およびその他の環境固有の変数の値を入力します。
CloudFormation コンソールからスタックを削除する
**重要:**Elastic Beanstalk 環境に統合された Amazon Relational Database Service (Amazon RDS) データベースがある場合は、まず Amazon RDS DB インスタンスを切り離します。
CloudFormation コンソールまたは AWS CLI のいずれかを使用して、スタックを削除することができます。
**CloudFormation コンソール **
- CloudFormation コンソールを開きます。
- [スタック] ページで、削除に失敗したスタックを選択します。
**注:**スタックの [ステータス] 列には DELETE_FAILED と表示されます。 - [削除] を選択します。
- [スタックの削除] ポップアップウィンドウで、「AWSebSecurityGroup」を選択し、[削除] を選択します。
重要:必ずセキュリティグループを削除してください。スタックを削除しても、AWSebSecurityGroup は自動的に削除されません。別の依存リソースが原因で環境の終了に失敗した場合は、まず [スタックを削除] ポップアップウィンドウから「DELETE_FAILED」状態の適切なリソースを選択します。次に、[削除] を選択します。 - Elastic Beanstalk 環境を[終了] または [再構築] します。
AWS CLI
-
CloudFormation スタックを削除するには、describe-network-interface-attribute コマンドを実行します。
aws cloudformation delete-stack --stack-name awseb-e-ztrauxujck-stack --retain-resources "AWSEBSecurityGroup" --region us-east-1
-
Elastic Beanstalk 環境を終了するには、terminate-environment コマンドを実行します。
aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1
-
Elastic Beanstalk 環境を再構築するには、rebuild-environment コマンドを実行します。
aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1
Elastic Beanstalk セキュリティグループの依存オブジェクトを見つけて削除します。
AWSEBSecurityGroup を削除できない依存ネットワークインターフェイスまたは依存セキュリティグループを見つけるには、次の手順を実行します。Amazon EC2 コンソールまたは AWS CLI のいずれかを使用できます。
Amazon EC2 コンソール
- Elastic Beanstalk イベントストリーム のエラーメッセージから AWSEBSecurityGroup のセキュリティグループ ID を取得します。
- Amazon EC2 コンソールを開きます。
- ナビゲーションペインで [セキュリティグループ] を選択します。次に、AWS AWSEBSecurityGroup ID を選択します。
- [アクション] を選択し、[セキュリティグループの削除] を選択して、AWSEBSecurityGroup への依存関係を検索します。
- [セキュリティグループの削除] ポップアップウィンドウで、次の手順を実行します。
[関連するインスタンスを表示] を選択します。
[アクション] を選択し、[ネットワーク] を選択します。
[セキュリティグループの変更] を選択します。
**[AWSebSecurityGroup ID] ** チェックボックスと ** [セキュリティグループを割り当てる] ** チェックボックスをオフにします。 - [セキュリティグループの削除] ポップアップウィンドウで、[参照しているセキュリティグループを表示] を選択します。
- AWSebSecurityGroup ** ID の関連付けを削除するには、[アクション]** を選択し、[インバウンドルールを編集] または [アウトバウンドルールを編集] を選択します。
- Elastic Beanstalk 環境を[終了] または [再構築] します。
AWS CLI
-
Elastic Beanstalk イベントストリーム のエラーメッセージから AWSEBSecurityGroup のセキュリティグループ ID を取得します。
-
.ebextensions フォルダに、次の例を参考に .config ファイルを作成します。
#!/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"
-
bash スクリプトを sg_dependency.sh という名前で保存します。
-
jq ウェブ サイトから jq utility をインストールします。
-
ネットワークインターフェイス ID、セキュリティグループ ID、またはその両方を取得するには、次のコマンドを実行します。
./sg_dependency.sh sg-111aaa22 us-east-1
**注:**sg-111aaa22 を自分の AWSEBSecurityGroup ID に置き換えてください。us-east-1 を AWS リージョンに置き換えてください。
-
ネットワークインターフェイス ID にアタッチされているセキュリティグループを見つけるには、describe-network-interface-attribute コマンドを実行します。
aws ec2 describe-network-interface-attribute --network-interface-id eni-1099d901 --attribute groupSet
-
AWSebSecurityGroup ID をデタッチするには、modify-network-interface-attribute コマンドを実行します。
aws ec2 modify-network-interface-attribute --network-interface-id eni-1099d901 --groups sg-030644d6c95b6470a sg-d34a33a8 sg-059c081ab30c3e38e sg-0e4eabc747368e6c9
**重要:**前のコマンドでは、AWSebSecurityGroup ID を除外します。他のセキュリティグループ ID を含めて、ネットワークインターフェイスにアタッチされたままにします。ネットワークインターフェイスを作成した AWS サービスに AWSEBSecurityGroup ID を含めると、コマンド出力は次のエラーを返します。 "An error occurred (AuthFailure) when calling the ModifyNetworkInterfaceAttribute operation: You don't have permission to access the specified resource".
-
describe-security-groups コマンドを実行して、依存するセキュリティグループのすべての受信ルールと送信ルールを一覧表示します。
-
ステップ 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":\[\]}\]'
**注:****ユーザー ID ** は AWS アカウント ID です。
-
Elastic Beanstalk 環境を終了するには、terminate-environment コマンドを実行します。
aws elasticbeanstalk terminate-environment --environment-name my-env --region us-east-1
- Elastic Beanstalk 環境を再構築するには、rebuild-environment コマンドを実行します。
aws elasticbeanstalk rebuild-environment --environment-name my-env --region us-east-1
関連情報
関連するコンテンツ
- 質問済み 2年前lg...
- 承認された回答質問済み 1年前lg...
- AWS公式更新しました 6ヶ月前
- AWS公式更新しました 1年前