Как я могу добавить зависимость от `aws_apigatewayv2_stage` для` aws_apigatewayv2_route` в Terraform? - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть настройка 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                = "POST /signup"
    logging_level            = "INFO"
    detailed_metrics_enabled = true
  }
}

Я получил ошибку ниже при развертывании:

Error: error creating API Gateway v2 stage: NotFoundException: Unable to find Route by key POST /signup within the provided RouteSettings

Кажется, что этап был развернут до создания маршрута. Как я могу добавить зависимость от стадии, чтобы зависеть от route?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Лучший способ создать зависимости в 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 .

0 голосов
/ 23 апреля 2020

Не похоже, что aws_apigatewayv2_route экспортирует любые полезные атрибуты, которые мы могли бы использовать. Но depends_on не работает в этом случае? -

resource "aws_apigatewayv2_stage" "staging_stage" {
  depends_on = [aws_apigatewayv2_route.signup_route]
...

https://www.terraform.io/docs/configuration/resources.html#depends_on -explicit-resource-зависимостей

=====

(РЕДАКТИРОВАТЬ здесь, потому что я не у меня еще достаточно представителей, чтобы прокомментировать другой ответ) Я не знал, что вы можете использовать входные данные из одного ресурса в качестве атрибута. Это довольно изящно, и определенно путь к go.

...