Terraform - aws_lambda_permission APIGW Пример исходного формата ARN перестал работать - PullRequest
0 голосов
/ 04 апреля 2020

В aws_lambda_permission приведен пример исходного ARN, которому предоставлен доступ к лямбда-функциям.

Часть source_arn = "${aws_api_gateway_rest_api.MyDemoAPI.execution_arn}/*/*/*" работала до сегодняшнего дня 4 / APR / 2020, но внезапно перестала работать.

Кто-нибудь заметил то же самое или, если что-то не так в коде, пожалуйста, предложите .

resource "aws_lambda_permission" "lambda_permission" {
  statement_id  = "AllowMyDemoAPIInvoke"
  action        = "lambda:InvokeFunction"
  function_name = "MyDemoFunction"
  principal     = "apigateway.amazonaws.com"

  # The /*/*/* part allows invocation from any stage, method and resource path
  # within API Gateway REST API.
  source_arn = "${aws_api_gateway_rest_api.MyDemoAPI.execution_arn}/*/*/*"
}

Не уверен, что изменилось, если это на стороне AWS или стороне поставщика Terraform AWS.

Примеры

Используется для работы

resource "aws_lambda_permission" "allow_apigw_invoke_lambda_receive_question_alias" {
  statement_id  = "1"
  principal     = "apigateway.amazonaws.com"
  source_arn    = "${aws_api_gateway_rest_api.mysfit.execution_arn}/*/*/*"
  action        = "lambda:InvokeFunction"
  function_name = local.lambda_receive_question_function_name
  qualifier     = local.lambda_receive_question_function_alias
}

Сгенерированный результат

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "1",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:11111111111:function:mysfit_mysfitsReceiveQuestion:v1",
      "Condition": {
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:execute-api:us-east-2::s8qgrp3acc/*/*/*"
        }
      }
    }
  ]
}

Работает сейчас

resource "aws_lambda_permission" "allow_apigw_invoke_lambda_receive_question_alias" {
  statement_id  = "1"
  principal     = "apigateway.amazonaws.com"
  source_arn = "arn:aws:execute-api:${data.aws_region.current.id}:${data.aws_caller_identity.current.account_id}:${aws_api_gateway_rest_api.mysfit.id}/*/*/*"
  action        = "lambda:InvokeFunction"
  function_name = local.lambda_receive_question_function_name
  qualifier     = local.lambda_receive_question_function_alias
}

Сгенерированный результат

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "1",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:1111111111:function:mysfit_mysfitsReceiveQuestion:v1",
      "Condition": {
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:execute-api:us-east-2:1111111111:s8qgrp3aeb/*/*/*"
        }
      }
    }
  ]
}

API GW Source ARN Формат

Формат работает сейчас, насколько я тестировал ниже.

"arn:aws:execute-api:${AWS_REGION}:${AWS_ACCOUNT_ID}:${AWS_REST_API_ID}/${AWS_API_DEPLOYMENT_STAGE_NAME}/${REST_API_METHOD_HTTP_VERB}/${REST_API_RESOURCE_PATH}"

В Terraform:

"arn:aws:execute-api:${data.aws_region.current.id}:${data.aws_caller_identity.current.account_id}:${aws_api_gateway_rest_api.mysfit.id}/*/${aws_api_gateway_integration.question_post.integration_http_method}${aws_api_gateway_resource.question.path}"

или

"arn:aws:execute-api:${data.aws_region.current.id}:${data.aws_caller_identity.current.account_id}:${aws_api_gateway_rest_api.mysfit.id}/*/*/*"
...