Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何在Terraform中使用数据源?_Amazon Web Services_Terraform - Fatal编程技术网

Amazon web services 如何在Terraform中使用数据源?

Amazon web services 如何在Terraform中使用数据源?,amazon-web-services,terraform,Amazon Web Services,Terraform,这个函数告诉我什么是数据源,但我不太理解它。有人能给我一个数据源的用例吗?它与使用变量配置有什么区别?数据源的使用有很多原因;但是他们的目标是做点什么,然后给你数据 让我们从他们的例子中看一下: 这使用数据源-这与资源不同!它只会给你信息,而不会创造任何东西。此示例将特别调用descripe imagesAWS API调用,按指定传入一些--filter选项,并返回一个可以从中获取信息的对象-看看这些 名字 所有者id 描述 图像识别码 。。。这个名单还有很多。如果我总是想获取与某些标记匹配

这个函数告诉我什么是数据源,但我不太理解它。有人能给我一个数据源的用例吗?它与使用变量配置有什么区别?

数据源的使用有很多原因;但是他们的目标是做点什么,然后给你数据

让我们从他们的例子中看一下:

这使用数据源-这与资源不同!它只会给你信息,而不会创造任何东西。此示例将特别调用
descripe images
AWS API调用,按指定传入一些
--filter
选项,并返回一个可以从中获取信息的对象-看看这些

  • 名字
  • 所有者id
  • 描述
  • 图像识别码
。。。这个名单还有很多。如果我总是想获取与某些标记匹配的最新AMI,并使启动配置保持最新,那么这真的很有用。我可以使用此数据提供程序,而不必总是更新变量或硬编码ID

数据源也可用于其他原因;我最喜欢的一个是


祝你好运

数据源提供有关当前地形配置未管理的实体的信息

这可能包括:

  • 来自领事馆的配置数据
  • 有关手动配置的基础结构组件状态的信息
换句话说,数据源是只读视图,用于查看配置外部的现有组件的状态

一旦定义了数据源,就可以在地形配置的其他位置使用数据

例如,假设我们要为新的AWS EC2实例创建地形配置。我们希望使用一个AMI映像,它是由Jenkins作业使用AWS CLI创建和上载的,而不是由Terraform管理的。作为Jenkins作业配置的一部分,此AMI映像将始终具有前缀为
app-
的名称

data "aws_ami" "app_ami" {
  most_recent = true
  filter {
    name   = "name"
    values = ["app-*"]
  }
}
在本例中,我们可以使用获取有关具有名称前缀
app-
的最新AMI图像的信息

data "aws_ami" "app_ami" {
  most_recent = true
  filter {
    name   = "name"
    values = ["app-*"]
  }
}
数据源导出属性,就像资源一样。我们可以使用语法
data.TYPE.NAME.ATTR
插入这些属性。在我们的示例中,我们可以将AMI ID的值插值为
data.aws\u AMI.app\u AMI.ID
,并将其作为


数据源在检索有关动态实体的信息时最为强大,这些实体的属性经常改变值。例如,下一次Terraform为我们的
aws_ami
数据源获取数据时,导出属性的值可能不同(我们可能已经构建并推送了一个新的ami)


变量用于静态值,即很少更改的值,例如访问和密钥,或服务器的标准sudoer列表。

数据源用于从提供程序端获取数据,以便将其用作.tf文件中的配置,而不是硬编码。示例:下面的代码获取AWS AMI ID并使用它启动AWS实例

data "aws_ami" "std_ami" {
  most_recent = true
  owners      = ["amazon"]

filter {
    name   = "root-device-type"
    values = ["ebs"]
  }

filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
}

resource "aws_instance" "myec2" {
  ami           = data.aws_ami.std_ami.id
  instance_type = "t2.micro"
}

好例子

Terraform数据源、资源和变量之间的主要区别是:

资源:在我们的平台上提供资源/infra。创建、更新和删除

变量在IAC上提供预定义值作为变量。由资源用于资源调配

数据源:从我们的infra/provider获取值,并为我们的资源提供数据以提供infra/resource


上面的例子解释得很好:)

嗨,谢谢TJ。你的回答很清楚。我不明白为什么terraform没有以您的方式解释什么是数据源。:-)还有一个问题可能与数据源有关,也可能与数据源无关:我在现有的AWS云(手动创建)中创建了一些新服务(使用terraform)。现在,我在我的服务资源中指出了现有云的id(子网、角色、vpc id等),例如subnet_id=“${var.subnet_private1_id}”,我将subnet_private1_id设置为terraform.tfvars中的实际子网id,将来我将向另一个AWS云运行terraform代码。然后将重新配置与当前云相关的所有id I。我应该只将当前云的所有相关id设置为变量,还是使用datasource?你想使用
terraform import
T J Biddle:我不需要改变现有的东西,我只需要基于现有云创建新的东西,所以我不需要导入。请看Gotchya——我真的建议您尽可能多地将基础结构转换为代码;这会让事情变得更容易。谢谢你。换句话说,1)数据源是提供现有基础设施的信息,而不是创建新的服务。2) 它会根据过滤逻辑检索动态实体。1)是的!2) 每个数据源都是不同的。对于
aws\u ami
数据源,因为它实际上调用了后面的CLI命令,并且支持过滤。对于其他数据源,可能没有筛选。每个数据源的配置特定于该数据源和provider.Oh。很高兴知道。再次感谢@d4nylhi@d4nill,感谢您的解释。归档文件数据源如何?当使用此文件时,将创建一个新文件,而不仅仅是“读取”某些内容。为什么他们认为数据源呢?@ Avele:这是一个我以前没有使用过的数据源,它看起来像是违反规范。如果你发现任何其他的例子,让我知道,我会更新我的答案。我想更准确地描述数据源的方法是,它们获取现有资源的状态,并将其合并为地形状态的一部分。
存档文件data "aws_ami" "std_ami" {
  most_recent = true
  owners      = ["amazon"]

filter {
    name   = "root-device-type"
    values = ["ebs"]
  }

filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
}

resource "aws_instance" "myec2" {
  ami           = data.aws_ami.std_ami.id
  instance_type = "t2.micro"
}