Terraform配置API Gateway集成Kinesis时URI参数报错如何处理
问题解决方案
你遇到的报错是因为直接传入Kinesis数据流的ARN作为API Gateway集成uri不符合AWS服务集成的uri规范,对接Kinesis时的uri构造规则和修改方案如下:
正确的uri构造规则
对接Kinesis服务时,uri需要按照API Gateway AWS服务集成的规范拼接,你所在的区域为eu-central-1,按你调用的Kinesis API不同填写对应值:
- 单条数据写入:调用
PutRecord接口,uri为arn:aws:apigateway:eu-central-1:kinesis:action/PutRecord - 批量数据写入:调用
PutRecords接口,uri为arn:aws:apigateway:eu-central-1:kinesis:action/PutRecords
修改后的Terraform配置示例
resource "aws_api_gateway_integration" "kinesis_integration" { rest_api_id = aws_api_gateway_rest_api.shippeo_api_kinesis.id resource_id = aws_api_gateway_resource.shippeo_api_resource_kinesis.id http_method = aws_api_gateway_method.post_json_files_kinesis.http_method # 注意:对接非Lambda的AWS服务使用AWS类型,不要用AWS_PROXY type = "AWS" # 替换为符合规范的uri uri = "arn:aws:apigateway:eu-central-1:kinesis:action/PutRecord" integration_http_method = "POST" # 需提前创建有Kinesis写入权限的IAM角色,填入角色ARN credentials = aws_iam_role.api_gateway_kinesis_role.arn # 配置请求头,Kinesis要求指定json协议版本 request_parameters = { "integration.request.header.Content-Type" = "'application/x-amz-json-1.1'" } # 配置请求模板,将客户端请求转换为Kinesis接受的格式,示例如下: request_templates = { "application/json" = <<EOF { "StreamName": "${aws_kinesis_stream.shippeo-kinesis-stream.name}", "Data": "$util.base64Encode($input.body)", "PartitionKey": "$context.requestId" } EOF } depends_on = [ aws_api_gateway_resource.shippeo_api_resource_kinesis ] }
额外注意事项
- 你需要为上述配置中用到的IAM角色添加权限策略,允许执行
kinesis:PutRecord或kinesis:PutRecords操作,资源指向你的Kinesis数据流ARN - 如果有自定义PartitionKey的需求,可以修改请求模板中的PartitionKey字段为你需要的取值逻辑
内容的提问来源于stack exchange,提问作者x89
相关产品推荐
相关产品推荐

