我无法创建一个API网关使用计划到它的阶段,即使我按照文档中给出的。
这是资源代码块。
resource "aws_api_gateway_usage_plan" "main" {
name = var.project
api_stages {
api_id = aws_api_gateway_rest_api.main.id
stage = aws_api_gateway_deployment.main.stage_name
}
quota_settings {
limit = 10000
period = "WEEK"
}
throttle_settings {
burst_limit = 5
rate_limit = 50
}
tags = var.tags
}
和Iterraform apply
时的错误消息;这很奇怪,因为我已经指定了舞台参数& &;价值。
Error: Missing required argument
│
│ with aws_api_gateway_usage_plan.main,
│ on main.tf line 112, in resource "aws_api_gateway_usage_plan" "main":
│ 112: resource "aws_api_gateway_usage_plan" "main" {
│
│ The argument "api_stages.0.stage" is required, but no definition was found.
整个脚本是这样的。
resource "aws_api_gateway_rest_api" "main" {
# naming api gateway
name = "api-gateway-${var.project}-${var.env}"
description = "API gateway for ${var.project}"
tags = var.tags
}
resource "aws_api_gateway_resource" "main" {
# define API endpoint
rest_api_id = aws_api_gateway_rest_api.main.id
parent_id = aws_api_gateway_rest_api.main.root_resource_id
path_part = "{proxy+}"
}
# method ------
resource "aws_api_gateway_method" "main" {
# define the method(s), e.g. GET / POST / etc.
resource_id = aws_api_gateway_resource.main.id
rest_api_id = aws_api_gateway_rest_api.main.id
authorization = "NONE"
http_method = "ANY"
}
# integration ------
resource "aws_api_gateway_integration" "main" {
# link with a lambda function
rest_api_id = aws_api_gateway_rest_api.main.id
resource_id = aws_api_gateway_resource.main.id
http_method = aws_api_gateway_method.main.http_method
integration_http_method = "POST"
type = "AWS_PROXY"
uri = var.lambda_arn
}
# deployment to stage ------
resource "aws_api_gateway_deployment" "main" {
# deploy API to a stage
rest_api_id = aws_api_gateway_rest_api.main.id
depends_on = [
aws_api_gateway_integration.main
]
lifecycle {
create_before_destroy = true
}
}
resource "aws_api_gateway_stage" "main" {
# define a stage
deployment_id = aws_api_gateway_deployment.main.id
rest_api_id = aws_api_gateway_rest_api.main.id
stage_name = var.env
}
resource "aws_lambda_permission" "apigw_lambda" {
statement_id = "AllowExecutionFromAPIGateway-${var.project}-${var.env}"
action = "lambda:InvokeFunction"
function_name = var.lambda_name
principal = "apigateway.amazonaws.com"
source_arn = "${aws_api_gateway_rest_api.main.execution_arn}/*/*"
}
# API key ------
resource "aws_api_gateway_usage_plan" "main" {
name = var.project
api_stages {
api_id = aws_api_gateway_rest_api.main.id
stage = aws_api_gateway_deployment.main.stage_name
}
quota_settings {
limit = 10000
period = "WEEK"
}
throttle_settings {
burst_limit = 5
rate_limit = 50
}
tags = var.tags
}
resource "aws_api_gateway_api_key" "main" {
name = "api-key-${var.project}"
}
resource "aws_api_gateway_usage_plan_key" "main" {
key_id = aws_api_gateway_api_key.main.id
key_type = "API_KEY"
usage_plan_id = aws_api_gateway_usage_plan.main.id
}
使用的版本为
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.21.0"
}
}
required_version = ">= 1.2.2"
}
原来我使用的文档是错误的/过时的。aws_api_gateway_deployment.main.stage_name
没有艺名
api_stages {
api_id = aws_api_gateway_rest_api.main.id
stage = aws_api_gateway_deployment.main.stage_name
}
后api_stages {
api_id = aws_api_gateway_rest_api.main.id
stage = aws_api_gateway_stage.main.stage_name
}