首页 > 解决方案 > 在 Terraform 中使用模块将 EIP 关联到我的 NAT 网关后出现错误

问题描述

我正在尝试使用带有模块的 Terraform 在 AWS 中创建基础设施。所以我得到了 2 个模块,一个用于我的 Nat 网关,一个用于 EIP 创建和关联。在我的主文件中,为了将 EIP 关联到 NAT 网关,我使用了 NAT GW 和 EIP 的 2 个输出属性,即 NAT 的 ID 和 EIP ID,如下所示:

module "eip_assoc" {
  source = "../Modules/eip_assoc"
  nat_gw_qa = module.NAT_GW.aws_nat_gateway_id_output
  nat_gw_association = module.EIP.eip_one_id_output
}

其余基础设施一切正常,当我应用主文件时,它会在 AWS 中创建资源并将 EIP 与 NAT GW 关联,但在控制台结束时会显示如下错误:

“错误:关联 EIP 时出错:InvalidNetworkInterfaceId.Malformed:无效 id:“nat-0c15axxxxxxxxxx”(应为“eni-...”)”

好吧,它说我需要来自 NAT GW 的 eni-... 输出而不是 Allocation_id,我将输出更改为 network_interface_id,它返回 NAT GW 的 ENI ID,但之后我得到了另一个不同的错误:

错误:关联 EIP 时出错:AuthFailure:您无权访问指定资源。

在这种情况下,与以前一样,它在 AWS 中创建基础设施,并将 EIP 与 NAT GW 关联起来完全没有问题,但是在 Terraform 文档中查找该错误消息后,它显示“不要使用 network_interface将 EIP 与 aws_lb 或 aws_nat_gateway 资源相关联。而是使用这些资源中可用的 allocation_id 来允许 AWS 管理关联,否则您将看到 AuthFailure 错误。

因此,如果我使用分配 ID,它会显示预期 ENI ID 的错误,如果使用 ENI ID,它会显示 AuthFailure 错误,在这两种情况下都会部署整个资源,但会收到这些错误消息。

标签: amazon-web-servicesterraformamazon-vpcterraform-provider-aws

解决方案


我从这个片段中看到的

    module "eip_assoc" {
    source = "../Modules/eip_assoc"
    nat_gw_qa = module.NAT_GW.aws_nat_gateway_id_output
    nat_gw_association = module.EIP.eip_one_id_output
    }

在我的主文件中,为了将 EIP 关联到 NAT 网关,我使用了 NAT GW 和 EIP 的 2 个输出属性,它们是 NAT 的 ID 和 EIP ID

问题在于顺序,您必须已经有一个 EIP 或创建一个新的 EIP 并创建 NAT 网关,或者换句话说,您不能创建 EIP 并创建 NAT 网关,然后将 EIP 与 NAT 网关相关联。

这就是为什么我们不能在创建 NAT 网关后交换它的 EIP 的原因。

引用文件

创建弹性 IP 地址后,您无法解除其与 NAT 网关的关联。要为您的 NAT 网关使用不同的弹性 IP 地址,您必须使用所需的地址创建一个新的 NAT 网关,更新您的路由表,然后删除不再需要的现有 NAT 网关。

文档中引用

要为您当前用于 NAT 实例的 NAT 网关使用相同的弹性 IP 地址,您还必须首先取消弹性 IP 地址与您的 NAT 实例的关联,然后在创建网关时将其与您的 NAT 网关关联。

指定要在其中创建 NAT 网关的子网,并选择与 NAT 网关关联的弹性 IP 地址的分配 ID。


推荐阅读