Лучший способ создать зависимости в Terraform - написать ссылки на ресурсы, от которых вы хотите зависеть. В этом случае это может выглядеть так:
resource "aws_apigatewayv2_route" "signup_route" {
api_id = "${aws_apigatewayv2_api.signup_redirect.id}"
route_key = "POST /signup"
target = "integrations/${aws_apigatewayv2_integration.lambda_integration.id}"
}
resource "aws_apigatewayv2_stage" "staging_stage" {
api_id = aws_apigatewayv2_api.signup_redirect.id
name = "staging"
auto_deploy = true
route_settings {
route_key = aws_apigatewayv2_route.signup_route.route_key
logging_level = "INFO"
detailed_metrics_enabled = true
}
}
Поскольку route_key
в route_settings
относится к aws_apigatewayv2_route.signup_route
, Terraform увидит это как зависимость от этого ресурса. Позволять подразумевать зависимости, как это хорошо, потому что это позволяет вам сосредоточиться на описании того, как данные распространяются от одного ресурса к другому, и если позже вы удалите этот блок route_settings
, то зависимость, которую он подразумевает, будет автоматически удалена без необходимости помнить обновите другое объявление.
Однако в некоторых случаях проект базовой системы делает невозможным явную зависимость потока данных. Одним из примеров этого являются AWS роли IAM, где политики, связанные с этой ролью, отделены от самой роли, и поэтому естественная взаимосвязь зависимых от потока данных данных заключается в том, что и политика, и объект, который будет выполнять роль, зависят от роли. и объект, принимающий роль, естественно, не зависит от политики. В этом случае нам, как правило, необходимо добавить дополнительные явные зависимости depends_on
, чтобы гарантировать, что система не будет пытаться взять на себя роль до того, как будут применены ее политики:
resource "aws_iam_role" "for_lambda" {
name = "lambda_function"
assume_role_policy = jsonencode({
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
})
}
resource "aws_iam_role_policy" "for_lambda" {
# (policy that the lambda function needs to do its work)
}
resource "aws_lambda_function" "example" {
name = "example"
# ...
# This reference makes the function depend on the role,
# but the role isn't ready to use until the associated
# policy has been attached to it too.
role = aws_iam_role.for_lambda.arn
# ...so we need to explicitly declare this hidden dependency:
depends_on = [aws_iam_role_policy.for_lambda]
}
Более подробная информация о том, как Зависимости работают в Terraform в Resource Dependencies .