terraform如何知道应该首先运行哪个资源来加速基础设施?

terraform如何知道应该首先运行哪个资源来加速基础设施?,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我正在使用terraform来加速Aws DMS。要启动DMS,我们需要子网组、DMS复制任务、DMS端点、DMS复制实例。我已经使用terraform文档配置了所有内容。我的问题是terraform如何知道首先要完成哪个任务来加速其他依赖性任务? 我们是否需要在terraform中的某个地方声明它,或者terraform是否足够智能以相应地运行?terraform将自动创建资源,以满足所有依赖关系 例如:如果您在DMS定义中将安全组id设置为“${aws_security_group.my_s

我正在使用terraform来加速Aws DMS。要启动DMS,我们需要子网组、DMS复制任务、DMS端点、DMS复制实例。我已经使用terraform文档配置了所有内容。我的问题是terraform如何知道首先要完成哪个任务来加速其他依赖性任务?
我们是否需要在terraform中的某个地方声明它,或者terraform是否足够智能以相应地运行?

terraform将自动创建资源,以满足所有依赖关系


例如:如果您在DMS定义中将安全组id设置为“${aws_security_group.my_sg.id}”,Terraform将识别此依赖项并在DMS资源之前创建安全组。

Terraform将自动创建资源,以满足所有依赖项的顺序


例如:如果您在DMS定义中将安全组id设置为
“${aws_security_group.my_sg.id}”
,Terraform会识别此依赖关系并在DMS资源之前创建安全组。

Terraform使用配置中的引用推断顺序

考虑以下示例:

resource "aws_s3_bucket" "example" {
  bucket = "terraform-dependencies-example"
  acl    = "private"
}

resource "aws_s3_bucket_object" "example" {
  bucket  = aws_s3_bucket.example.bucket # reference to aws_s3_bucket.example
  key     = "example"
  content = "example"
}
在上面的示例中,
aws\u s3\u bucket\u对象。example
资源包含一个引用
aws\u s3\u bucket.example.bucket
,因此Terraform可以推断
aws\u s3\u bucket\u对象。example
必须在
aws\u s3\u bucket\u对象之前创建


这些由引用创建的隐式依赖关系是在Terraform中创建排序的主要方式。在一些罕见的情况下,我们需要表示无法由表达式推断的依赖项,因此对于那些特殊情况,只有我们可以使用
dependens\u on
元参数添加额外的显式依赖项

可能出现这种情况的一种情况是AWS IAM策略,在这种情况下,由引用自然创建的图形往往具有以下形状:

由于AWS IAM的数据模型,我们必须首先创建一个角色,然后将策略作为单独的步骤分配给它,但是假定该角色的对象(在本例中,仅举AWS Lambda函数为例)只引用角色本身,而不引用策略。使用引用隐式创建的依赖关系,Lambda函数可能在其角色具有所需访问权限之前创建,如果函数在分配策略之前尝试执行任何操作,则会导致错误

为了解决这个问题,我们可以在
aws\u lambda\u函数
资源块中使用
dependens\u on
,强制实现额外的依赖关系,从而创建正确的执行顺序:

resource "aws_iam_role" "example" {
  # ...
}

resource "aws_iam_role_policy" "example" {
  # ...
}

resource "aws_lambda_function" "exmaple" {
  depends_on = [aws_iam_role_policy.example]
}



有关Terraform中资源依赖关系的更多信息,请参阅Terraform文档中的。Terraform使用配置中的引用推断顺序

考虑以下示例:

resource "aws_s3_bucket" "example" {
  bucket = "terraform-dependencies-example"
  acl    = "private"
}

resource "aws_s3_bucket_object" "example" {
  bucket  = aws_s3_bucket.example.bucket # reference to aws_s3_bucket.example
  key     = "example"
  content = "example"
}
在上面的示例中,
aws\u s3\u bucket\u对象。example
资源包含一个引用
aws\u s3\u bucket.example.bucket
,因此Terraform可以推断
aws\u s3\u bucket\u对象。example
必须在
aws\u s3\u bucket\u对象之前创建


这些由引用创建的隐式依赖关系是在Terraform中创建排序的主要方式。在一些罕见的情况下,我们需要表示无法由表达式推断的依赖项,因此对于那些特殊情况,只有我们可以使用
dependens\u on
元参数添加额外的显式依赖项

可能出现这种情况的一种情况是AWS IAM策略,在这种情况下,由引用自然创建的图形往往具有以下形状:

由于AWS IAM的数据模型,我们必须首先创建一个角色,然后将策略作为单独的步骤分配给它,但是假定该角色的对象(在本例中,仅举AWS Lambda函数为例)只引用角色本身,而不引用策略。使用引用隐式创建的依赖关系,Lambda函数可能在其角色具有所需访问权限之前创建,如果函数在分配策略之前尝试执行任何操作,则会导致错误

为了解决这个问题,我们可以在
aws\u lambda\u函数
资源块中使用
dependens\u on
,强制实现额外的依赖关系,从而创建正确的执行顺序:

resource "aws_iam_role" "example" {
  # ...
}

resource "aws_iam_role_policy" "example" {
  # ...
}

resource "aws_lambda_function" "exmaple" {
  depends_on = [aws_iam_role_policy.example]
}



有关Terraform中的资源依赖关系的更多信息,请参阅Terraform文档中的。

非常好的解释。。非常感谢您的回复。谢谢:)很好的解释,马丁。。非常感谢您的回复。谢谢:)