Я пытаюсь развернуть шлюз AWS API и Lambda с помощью Terraform. Шлюз - это просто прокси для моей функции. После запуска terraform apply каждый веб-запрос к конечной точке терпит неудачу.
Шлюзы API регистрируют это сообщение об ошибке в Cloudwatch:
Execution failed due to configuration error: Invalid permissions on Lambda function
Но теперь это становится странным: если я нажму кнопку развертывания в веб-консоли AWS и просто еще раз разверну (ничего не изменилось) шлюз API, все будет работать нормально. Следующее «терраформирование» снова развертывает aws_api_gateway_stage.staging, и это снова все ломает.
Это моя настройка Terraform:
лямбда.tf:
resource "aws_lambda_function" "contactform-api" {
filename = "deploy.zip"
function_name = "contactform-api"
handler = "main"
runtime = "go1.x"
role = "${aws_iam_role.lambda_role.arn}"
publish = "false"
timeout = "60"
}
resource "aws_iam_role" "lambda_role" {
name = "iam_for_lambda"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": "IAMRoleForLambda"
}
]
}
EOF
}
resource "aws_lambda_permission" "apigw" {
statement_id = "AllowExecutionFromAPIGateway"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.contactform-api.arn}"
principal = "apigateway.amazonaws.com"
source_arn = "${aws_api_gateway_rest_api.contactform.execution_arn}/*/*/*"
}
api_gateway.tf:
resource "aws_api_gateway_rest_api" "contactform" {
name = "ContactformAPI"
description = "Contactform REST API"
}
resource "aws_api_gateway_resource" "api" {
rest_api_id = "${aws_api_gateway_rest_api.contactform.id}"
parent_id = "${aws_api_gateway_rest_api.contactform.root_resource_id}"
path_part = "{proxy+}"
}
resource "aws_api_gateway_method" "api" {
rest_api_id = "${aws_api_gateway_rest_api.contactform.id}"
resource_id = "${aws_api_gateway_resource.api.id}"
http_method = "ANY"
authorization = "NONE"
}
resource "aws_api_gateway_integration" "lambda" {
rest_api_id = "${aws_api_gateway_rest_api.contactform.id}"
resource_id = "${aws_api_gateway_resource.api.id}"
http_method = "${aws_api_gateway_method.api.http_method}"
integration_http_method = "POST"
type = "AWS_PROXY"
uri = "${aws_lambda_function.contactform-api.invoke_arn}"
}
resource "aws_api_gateway_deployment" "staging" {
depends_on = ["module.cors", "aws_api_gateway_method.api", "aws_api_gateway_resource.api", "aws_api_gateway_integration.lambda"]
stage_name = "staging"
rest_api_id = "${aws_api_gateway_rest_api.contactform.id}"
}
resource "aws_api_gateway_stage" "staging" {
stage_name = "staging"
rest_api_id = "${aws_api_gateway_rest_api.contactform.id}"
deployment_id = "${aws_api_gateway_deployment.staging.id}"
}





Вы используете ARN функции Lambda в качестве function_name в вашем ресурсе aws_lambda_permission.
Изменение этого имени, а не ARN, должно решить эту проблему за вас:
resource "aws_lambda_permission" "apigw" {
statement_id = "AllowExecutionFromAPIGateway"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.contactform-api.function_name}"
principal = "apigateway.amazonaws.com"
source_arn = "${aws_api_gateway_rest_api.contactform.execution_arn}/*/*/*"
}
Что касается того, почему это работает при развертывании через консоль AWS; консоль AWS волшебным образом устанавливает разрешения для вас, поэтому вам не нужно манипулировать ими через веб-интерфейс. Когда Terraform повторно развертывает изменения, он снова сломает их, потому что Terraform необходимо явно указать разрешения для функции Lambda.
Изменение function_name не помогло. Что еще может быть не так?
function_name на самом деле может быть функцией arn, вы можете подтвердить в документация