【问题标题】:Update and append new properties on exising resource on AWS using Terraform使用 Terraform 在 AWS 上的现有资源上更新和附加新属性
【发布时间】:2021-04-26 14:38:54
【问题描述】:

我是 Terraform 的新手,很高兴能使用它。

我已经通过 Terraform 创建了 security group A,我想将 security group A 附加到 existing security group B 中。我试图弄清楚它看起来像 javascript 中的对象分配和传播运算符。

我想象如下,

data "aws_security_group" "A" {
  id = "<id>"
}

resource "aws_security_group" "A" {
  ...data.aws_security_group.A,
  ingress = [ ...data.aws_security_group.A.ingress]
}

这是我目前的想法,

resource "aws_security_group" "A" {
  vpc_id = var.a_vpc_id

  ingress = [module.eks.aws_security_group.cluster] // I only want to add this ingress into the existing ingress at security group A
  lifecycle = {
    ignore_changes = [
      ingress // ignore existing ingress
    ]
  }
}

是否有任何语法或调整来完成我想要的?任何参考和关键字都会让我开心。


(更新)几乎是真实的代码。

variable "internal_vpc_id" {
  default = "vpc-12345678"
}

module "eks" {
 ....
}

resource "aws_security_group" "internal" {
  vpc_id = var.internal_vpc_id
  
  ingress = [
               module.eks.aws_security_group.cluster,
               module.eks.aws_security_group.workers, 
               module.eks.aws_security_group_rule.cluster_egress_internet,
            module.eks.aws_security_group_rule.cluster_https_worker_ingress
            ]
  lifecycle {
    ignore_changes = [
      ingress
    ]
  }
}

【问题讨论】:

  • 您能否提供实际的、可重现的代码,因为不清楚...data.aws_security_group.A,ingress = [ ...data.aws_security_group.A.ingress] 以及其他人的含义。
  • @Marcin 已更新,这是我正在尝试的当前代码,与示例并没有真正的不同。

标签: amazon-web-services terraform terraform-provider-aws


【解决方案1】:

我想将安全组 A 附加到现有的安全组 B

如果 SG B 不是由 AWS 使用 aws_security_group 管理,则您不能直接修改 terraform (TF) 中的 SG B。为此,您必须将import B 加入 TF。这将允许您对其进行修改。

为避免导入过程,您可以使用aws_security_group_rule。这只会创建一个需要的规则,并将其附加到现有的 SG B,即使它不是由 TF 管理的。

因此,使用aws_security_group_rule 你可以做(​​伪代码):

data "aws_security_group" "B" {
  id = "SG-B-id"
}

resource "aws_security_group_rule" "ruleB" {
  type                       = "ingress"
  from_port                  = 0
  to_port                    = 65535
  protocol                   = "tcp"
  source_security_group_id   = aws_security_group.A.id
  security_group_id          = data.aws_security_group.B.id
}


【讨论】:

  • 谢谢。我可以在不导入的情况下访问data "aws_security_group" "B" { id = "SG-B-id" } 吗?我很困惑import 的用法
  • @sunsets 是的。 data 仅获取有关现有资源的信息。 import 将允许您完全管理要导入的资源。
  • 我认为我必须采取两种方式来迁移和使用现有资源中的所有资源。
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 2021-09-21
  • 2018-05-06
  • 2022-07-24
  • 1970-01-01
  • 2017-09-21
  • 2023-01-02
相关资源
最近更新 更多