带有 Terraform 的 S3 的 AWS VPC 终端节点 - 错误:多个 VPC 终端节点服务匹配

问题描述

我在 terraform (v0.11.14) 中使用 aws_vpc_endpoint_service 在我的 AWS 账户上为 S3 创建 AWS VPC 端点,最近开始面临以下错误Error: multiple VPC Endpoint Services matched; use additional constraints to reduce matches to a single VPC Endpoint Service

同样的代码之前运行良好。分辨率是多少?

解决方法

我找到了解决方法。

问题的原因:

  • AWS 刚刚在 S3 (PrivateLink) 中发布了一项新功能,这意味着现在搜索 S3 端点服务时会返回多个结果。参考:Amazon S3 now supports AWS PrivateLink
  • 如果返回多个结果,Terraform AWS Provider 中的单一数据源(如 aws_vpc_endpoint_service)会返回错误。

如果 AWS 提供商版本 >= v3.10.0 的解决方案:

  • 在 Terraform 模板中使用以下内容:
data "aws_vpc_endpoint_service" "s3" {
  service      = "s3"
  service_type = "Gateway"
}

如果 AWS 提供商版本

如果您无法更新到提供程序的最新版本,作为临时解决方法,您还可以使用 com.amazonaws.REGION.s3 作为下游配置中的端点值,而不是使用数据源。

  • 在 Terraform 模板中使用以下内容:
data "aws_region" "current" {}

resource "aws_vpc_endpoint" "s3" {
  vpc_id       = "${local.vpc_id}"
  service_name = "com.amazonaws.${data.aws_region.current.name}.s3"
}

仅此而已。

以前的参考代码不再起作用:

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

resource "aws_vpc_endpoint" "s3" {
  vpc_id       = "${local.vpc_id}"
  service_name = "${data.aws_vpc_endpoint_service.s3.service_name}"
}
,

对于 aws provider filter 中的 aws_vpc_endpoint_service 配置块解决此问题

data "aws_vpc_endpoint_service" "s3" {
  service = "s3"
  filter {
    name   = "service-type"
    values = ["Gateway"]
  }
}
    
resource "aws_vpc_endpoint" "s3" {
  vpc_id       = "${aws_vpc.vpc.id}"
  service_name = "${data.aws_vpc_endpoint_service.s3.service_name}"
}

另见 github 问题页面 https://github.com/hashicorp/terraform-provider-aws/issues/17417

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...