为什么我无法分离或删除 Lambda 创建的弹性网络接口?
我尝试分离或删除 AWS Lambda 创建的弹性网络接口,但我收到了一条错误消息。
简短描述
您只能通过 Lambda 删除网络接口。如果您删除网络接口代表的资源,则 Lambda 会为您分离并删除相应的网络接口。要删除未使用的网络接口,Lambda 会使用创建了网络接口的函数的执行角色。但是,您无法删除某个函数或函数版本使用的网络接口。
Lambda 在具有相同 Amazon Virtual Private Cloud (Amazon VPC) 配置的多个函数和事件源映射之间共享网络接口。要减少您在 AWS 账户中使用的网络接口数量,您可以共享网络接口。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
确定使用网络接口的函数和函数版本
**注意:**以下命令仅适用于 Linux 和 Unix 操作系统。
要确定使用网络接口的函数或函数版本,请使用 GitHub 网站上的 Lambda ENI Finder。
完成以下步骤:
-
使用有权查询 Lambda 和网络接口的 AWS Identity and Access Management (IAM) 角色配置 AWS CLI。
**重要事项:**Lambda 使用函数执行角色的权限来删除 Hyperplane 弹性网络接口。请仅在 Lambda 删除 Hyperplane 弹性网络接口之后,再删除执行角色。 -
要安装 jq 命令行 JSON 处理器,请运行以下命令:
sudo yum install jq -y**注意:**有关详细信息,请参阅 jq 网站上的 jq。
-
要安装 Git,请运行以下命令:
sudo yum install git -y**注意:**有关详细信息,请参阅 Git 网站上的 Getting started - installing Git(入门 - 安装 Git)。
-
要克隆 aws-support-tools GitHub 存储库,请运行以下命令:
git clone https://github.com/awslabs/aws-support-tools.git**注意:**有关详细信息,请参阅 GitHub 网站上的 aws-support-tools。
-
要将目录更改为 Lambda ENI Finder 的位置,请运行以下命令:
cd aws-support-tools cd Lambda cd FindEniMappings -
要针对要删除的网络接口运行 Lambda ENI Finder,请运行以下命令:
./findEniAssociations --eni eni-0123456789abcef01 --region us-east-1**注意:**请将 eni-0123456789abcef01 替换为网络接口 ID,并将 us-east-1 替换为网络接口所在的 AWS 区域。有关详细信息,请参阅请求者托管的网络接口。
输出结果将返回您的账户和区域中使用网络接口的 Lambda 函数和函数版本的列表。如果您需要这些函数或函数版本中的任何一个,请不要删除该网络接口。
如果输出结果中未列出任何函数或函数版本,请检查您账户中的以下服务是否使用网络接口:
- Amazon Managed Streaming for Apache Kafka (Amazon MSK)
- 自行管理的 Apache Kafka
- Amazon MQ for ActiveMQ
- Amazon MQ for RabbitMQ
- Amazon DocumentDB(兼容 MongoDB)
确定使用网络接口的事件源映射
使用 AWS CLI
完成以下步骤:
-
使用有权查询 Lambda、Amazon MSK、Amazon MQ 和 Amazon DocumentDB 的 IAM 角色配置 AWS CLI。
**注意:**Lambda 使用与事件源映射相关的函数执行角色中的权限来删除 Hyperplane 弹性网络接口。请仅在 Lambda 删除 Hyperplane 弹性网络接口之后,再删除执行角色。 -
要列出事件源映射,请运行以下 list-event-source-mappings 命令:
aws lambda list-event-source-mappings --query 'EventSourceMappings[?State != Disabled]' -
检查每个事件源映射的 EventSourceArn 字段或 SelfManagedEventSource 字段。
如果 EventSourceArn 字段包含 MSK 集群、Amazon MQ 代理或 Amazon DocumentDB 集群的 Amazon 资源名称 (ARN),请记下该 ARN。
要查看集群或代理的详细信息,请根据事件源运行以下命令之一。
对于 Amazon MSK,运行以下 describe-cluster-v2 命令:aws kafka describe-cluster-v2 --cluster-arn MSK_CLUSTER_ARN**注意:**请将 MSK_CLUSTER_ARN 替换为您的 MSK 集群的 ARN。
对于 Amazon MQ,运行以下 describe-broker 命令:aws mq describe-broker --broker-id MQ_BROKER_ID**注意:**请将 MQ_BROKER_ID 替换为您的 Amazon MQ 代理 ID。
对于 Amazon DocumentDB,运行以下 describe-db-clusters 命令:aws docdb describe-db-clusters --db-cluster-identifier DOCDB_CLUSTER_ID**注意:**请将 DOCDB_CLUSTER_ID 替换为您的 Amazon DocumentDB 集群 ID。
-
在命令的输出结果中,检查集群或代理是否使用与网络接口相同的子网和安全组 ID。
-
如果存在 SelfManagedEventSource 字段,请检查网络接口的子网和安全组 ID 是否列在事件源映射的 SourceAccessConfigurations 下。
使用 Lambda 控制台
**注意:**要检查自行管理的 Apache Kafka 的事件源映射,必须使用 Lambda 控制台。
完成以下步骤:
- 打开 Lambda 控制台。
- 在导航窗格中,选择 Event source mappings(事件源映射)。
- 查看 Event source service(事件源服务)列,查找 apache kafka、docdb、msk 或 mq 对应的事件源映射。
- 对于 docdb、msk 或 mq,记下 Event source resource(事件源资源)下的集群或代理名称。对于 apache kafka,选择事件源映射的 UUID,然后继续执行步骤 8。
- 使用 Amazon MSK、Amazon MQ 或 Amazon DocumentDB 控制台搜索集群或代理名称。
- 选择集群或代理名称以查看其详细信息。
- 在网络设置中,验证您是否已将集群或代理配置为使用与网络接口相同的子网和安全组 ID。
- 为您的服务选择 Event Source ARN(事件源 ARN),查看事件源和服务配置。
- 在 Source access configurations(源访问配置)下,检查是否列出了网络接口的子网和安全组 ID。
删除 Lambda 创建的网络接口
完成以下步骤:
- 运行 Lambda ENI Finder。
- 对于列出的每个未发布的 Lambda 函数版本 ($LATEST),请完成以下步骤之一:
更改 Amazon VPC 配置以使用不同的子网和安全组。
-or-
断开函数与 Amazon VPC 的连接。 - 对于已发布的 Lambda 函数版本,请删除每个版本。
**注意:**因为您无法编辑已发布的函数版本,因此无法更改 Amazon VPC 配置。 - 对于使用网络接口的每个 Lambda 事件源映射,请关闭或删除事件源映射。
- 要验证网络接口是否已不再使用,请再次运行 Lambda ENI Finder。
当同时满足以下两项设置时,Lambda 会自动删除网络接口:
- 输出结果中未列出其他函数或函数版本。
- 事件源映射未使用网络接口。
查找和删除抓取器
如果您将 Lambda 网络接口与 Amazon Managed Service for Prometheus 抓取器相关联,请完成以下步骤:
-
要识别您的抓取器配置,请运行以下 list-rule-groups-namespaces 命令:
aws amp list-rule-groups-namespaces -
要列出账户中的抓取器,请运行以下 list-scrapers 命令:
aws amp list-scrapers --region your-region**注意:**请将 your-region 替换为您的区域。
-
要删除抓取器,请运行以下 delete-scraper 命令:
aws amp delete-scraper --scraper-id your-scraperId**注意:**请将 your-scraperId 替换为您的抓取器 ID。等待 5-10 分钟,待抓取器删除完成后再继续执行步骤 4。
-
要删除 ENI,请运行以下 delete-network 命令:
aws ec2 delete-network --your-network-interface-id**注意:**请将 your-network-interface-id 替换为您的网络接口 ID。
有关更多信息,请参阅查找和删除抓取器。

