【问题标题】:Error applying terraform plan to create VPC endpoint in AWS应用 terraform 计划在 AWS 中创建 VPC 终端节点时出错
【发布时间】:2020-03-01 03:21:03
【问题描述】:

我正在尝试为 EC2 节点创建一个 VPC 端点,以访问 us-east-1 中同一 VPC 内的 S3 存储桶,而无需通过 NAT 网关。当我通过浏览器 UI 手动设置时,一切似乎都正常。然后我将其删除并在我的 terraform 配置中将其定义为 aws_vpc_endpoint,如下所示:

    resource "aws_vpc_endpoint" "vpc-s3-endpoint-dev" {
      vpc_id          = "${aws_vpc.dev.id}"
      service_name    = "com.amazonaws.us-east-1.s3"
      route_table_ids = ["${aws_route_table.dev-us-east-1-private.id}"]
    }

计划顺利,当我尝试申请时,我得到了这个:

Error: Error applying plan:

1 error(s) occurred:

* aws_vpc_endpoint.vpc-s3-endpoint-dev: 1 error(s) occurred:

* aws_vpc_endpoint.vpc-s3-endpoint-dev: Error creating VPC Endpoint: InvalidServiceName: The Vpc Endpoint Service 'com.amazonaws.us-east-1.s3' does not exist
    status code: 400, request id: b062c637-ec55-4da4-8527-73b24c10fa3d

据我所知,我做的一切都是正确的。该路由表与我手动成功创建的测试 VPC 终端节点关联的路由表相同。我已经尝试通过将关联的路由表分解为单独的 aws_vpc_endpoint_route_table_association 来做到这一点,甚至根本没有。我还尝试了 us-east-1 S3 服务端点的其他别名(com.amazonaws.s3 等)。我只是不断收到同样令人沮丧的错误,而且我没有想法。

编辑:更多上下文

   provider "aws" { 
     alias = "dev" 
     version = "= 2.12.0" 
     profile = "development" 
     region = "us-east-1" 
   } 
     resource "aws_vpc" "dev" { 
       provider = "aws.dev" 
       cidr_block = "10.201.0.0/16" 
       enable_dns_support = "true" 
       enable_dns_hostnames = "true" 
     } 

将特定提供程序添加到aws_vpc_endpoint 资源似乎有效。

aws_vpc_endpoint.vpc-s3-endpoint-dev-xxx-xxxxx: Creation complete after 6s (ID: vpce-xxxxxxxxxxxxx)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

【问题讨论】:

  • 您的提供商配置是什么样的?默认情况下使用us-east-1吗?您的 VPC 在哪个区域?
  • 将其编辑到您的问题中,然后您可以将其格式化为代码块。
  • 此外,您似乎刚刚错过了 aws_vpc_endpoint 中的提供程序配置。您需要它来匹配您的 VPC。您在这里使用多个提供商是否有原因?
  • provider = "aws.dev" 添加到aws_vpc_endpoint资源是否有效?
  • 那是因为它在提供者文档中。将它添加到每个资源中不会很有条理。你可以在这里找到它:terraform.io/docs/configuration/…

标签: amazon-web-services amazon-s3 terraform amazon-vpc


【解决方案1】:

因此,我们今天在 us-east-1 中看到了类似的错误:

data "aws_vpc_endpoint_service" "s3" {
    service = "s3"
}

我们能够使用 CLI 重现该问题:

aws ec2 describe-vpc-endpoint-services | jq '.ServiceDetails[] | select(.ServiceName=="com.amazonaws.us-east-1.s3")'

显示存在同名的服务,但此调用出错:

$ aws ec2 describe-vpc-endpoint-services --service-names com.amazonaws.us-east-1.s3
An error occurred (InvalidServiceName) when calling the DescribeVpcEndpointServices operation: The Vpc Endpoint Service 'com.amazonaws.us-east-1.s3' does not exist

AWS 支持人员表示此 API 存在一些问题,该问题发生在 us-east-1 中,但不是 us-west-1 或 us-west-2。所以有可能您的 Terraform 代码实际上是正确的,但是还有其他一些 AWS API 后端问题?

【讨论】:

  • 原来我们的问题是亚马逊方面的暂时性 API 问题。他们在我们的支持案例后不久修复了它。
【解决方案2】:

问题已经在 cmets 中解决了,但我将把它留在这里以供将来参考,因为它是这里问题的症结所在。

如果您在 provider 块中使用 alias,则除非您明确指定它在资源级别(如上面在 provider = "aws.dev" 中所做的那样,否则将不会使用该提供程序)。在您未明确指定的情况下,默认提供程序将是 provider "aws",它没有与之关联的别名,如果不存在,那么它将假定一个隐含的 aws 提供程序.

故事的寓意,除非您有充分的理由,否则不要在您的提供商上使用别名;拥有一个发布到多个单独 AWS 账户的代码库是一个很好的理由。

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2021-05-15
    • 2021-12-22
    • 2021-02-08
    相关资源
    最近更新 更多