我已经构建了一个API网关,它使用AWS控制台与Dynamodb集成,并将其启动和运行作为概念验证。现在我想把这个API网关通过CloudFormation重新生成,以供实际使用。
我已经能够得到它的大部分部署使用我的CFT,但我被困在AWS::ApiGateway::Method
资源。具体来说,是Integration
属性。
ResourceHttpGet:
Type: AWS::ApiGateway::Method
Properties:
AuthorizationScopes:
- openid
AuthorizationType: COGNITO_USER_POOLS
AuthorizerId: {'Fn::ImportValue': !Sub '${ProductName}-${TargetEnvironment}-authorizer-customerpool' }
HttpMethod: GET
OperationName: GetFoo
RequestModels:
"application/json": {'Fn::ImportValue': !Sub '${ProductName}-${TargetEnvironment}-apigw-foomodel' }
Integration:
Credentials: !Ref ApiGatewayDynamoDbRole
IntegrationHttpMethod: POST
RequestTemplates:
application/json: !Sub '{ "TableName": "${ProductName}-${TargetEnvironment}-dynamo-primaryapi", "KeyConditionExpression": "UserId = :val", "Limit": 50, "ExpressionAttributeValues": { ":val": { "S": "$context.authorizer.claims.sub" } } }'
Type: AWS
Uri: !Sub "arn:aws:apigateway:${AWS::Region}:dynamodb:action/Query"
ResourceId: !Ref FooResource
RestApiId: {'Fn::ImportValue': !Sub '${ProductName}-${TargetEnvironment}-apigw-primaryapi' }
当我将此上传到CloudFormation控制台并运行它时,CF Stack在ResourceHttpGet
资源上出现以下错误:
请求中指定的无效ARN (Service: amazonapiggateway;状态码:400;错误代码:BadRequestException;请求ID: e6767c61-96dc-461a-ab7c-fd625344b59f;代理:null)
我可以注释掉Integration
属性并且堆栈成功部署。我使用了几个不同的资源来帮助验证我使用的ARN是准确的。一篇是我发现的关于API Gateway/Dynamodb集成的博客文章,另一篇是关于Stackoverflow
攻击:aws: apigateway:地区:subdomain.service |服务:路径/service_api |行动。例如,Lambda函数的URI遵循以下形式:arn:aws:apigateway:region: Lambda:path/path.
我还删除了!sub
函数的使用,只是硬编码区域到Uri中,以测试是否使用内在函数导致了问题,但这并没有什么不同。
完全困惑,希望有人能给我一些指导。
如果您正在尝试基于手动创建的API网关设置创建CloudFormation文件,我会查看一下AWS SAM。这样更简洁,更容易设置。具体来说,我将看看AWS::Serverless::Api
类型的DefinitionBody
属性。这个属性允许你传入API的openapi体定义。
作为起点,您还可以使用控制台或文档中指示的其他方法之一导出当前api。
将这两件事结合起来将使在CloudFormation中构建API网关变得容易得多。