Я использую CloudFormation для управления стеком Amazon API Gateway и пытаюсь (повторно) использовать вложенный стек для добавления метода OPTIONS к каждому из моих методов конечной точки HTTP, чтобы я мог отвечать заголовками CORS.
Вот фрагмент CloudFormation, который относится к вложенному стеку:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "AWS CloudFormation template for example HTTP endpoint",
"Resources": {
"MyRestApi": {
"Type": "AWS::ApiGateway::RestApi",
"Properties": {
"Name": "api.example.com"
}
},
"HelloResource": {
"Type": "AWS::ApiGateway::Resource",
"Properties": {
"RestApiId": { "Ref": "MyRestApi" },
"ParentId": { "Fn::GetAtt": [ "MyRestApi", "RootResourceId" ] },
"PathPart": "hello"
}
},
"GETHello": {
"Type": "AWS::ApiGateway::Method",
"Properties": {
"RestApiId": { "Ref": "MyRestApi" },
"ResourceId": { "Ref": "HelloResource" },
"HttpMethod": "GET",
"AuthorizationType": "NONE",
"Integration": {
"Type": "HTTP",
"IntegrationHttpMethod": "GET",
"Uri": "https://my-api-server.example.com/hello",
"IntegrationResponses": [ { "StatusCode": "200" } ],
"RequestParameters": { "integration.request.header.Authorization": "method.request.header.Authorization" }
},
"MethodResponses": [
{
"StatusCode": "200",
"ResponseModels": { "text/html": "Empty" }
}
],
"RequestParameters": { "method.request.header.Authorization": true }
}
},
"OPTIONSHello": {
"Type": "AWS::CloudFormation::Stack",
"Properties": {
"Parameters": {
"RestApiId": "MyRestApi",
"ResourceId": "HelloResource"
},
"TemplateURL": "https://s3-eu-west-1.amazonaws.com/my-cloudformation-bucket/api-gateway-cors-headers.json"
}
}
}
}
а затем шаблон CloudFormation, к которому он относится - API-шлюз-cors-headers.json - выглядит так:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "AWS CloudFormation template for CORS headers,
"Parameters": {
"RestApiId": { "Type": "String" },
"ResourceId": { "Type": "String" }
},
"Resources": {
"CORSHeader": {
"Type": "AWS::ApiGateway::Method",
"Properties": {
"AuthorizationType": "NONE",
"RestApiId": { "Ref": "RestApiId" },
"ResourceId": { "Ref": "ResourceId" },
"HttpMethod": "OPTIONS",
"Integration": {
"IntegrationResponses": [
{
"StatusCode": 200,
"ResponseParameters": {
"method.response.header.Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'",
"method.response.header.Access-Control-Allow-Methods": "'POST,OPTIONS'",
"method.response.header.Access-Control-Allow-Origin": "'*'"
},
"ResponseTemplates": {
"application/json": ""
}
}
],
"PassthroughBehavior": "WHEN_NO_MATCH",
"RequestTemplates": { "application/json": "{\"statusCode\": 200}" },
"Type": "MOCK"
},
"MethodResponses": [
{
"StatusCode": 200,
"ResponseModels": {
"application/json": "Empty"
},
"ResponseParameters": {
"method.response.header.Access-Control-Allow-Headers": false,
"method.response.header.Access-Control-Allow-Methods": false,
"method.response.header.Access-Control-Allow-Origin": false
}
}
]
}
}
}
}
Проблема в том, что я не могу понять, как передать параметры RestApiId и ResourceId из родительского стека во вложенный стек. В зависимости от того, какой синтаксис я пробую, я получаю три или четыре разных сообщения об ошибках - самое последнее. Template format error: Unresolved resource dependencies [RestApiId, ResourceId] in the Resources block of the template
- но не могу найти примеров того, как передать идентификатор REST API и идентификатор ресурса во вложенный шаблон стека. Что я делаю не так?
В настоящее время вы передаете строки «MyRestApi» и «HelloResource», а не ссылки на ресурсы. Передайте их вместо
"OPTIONSHello": {
"Type": "AWS::CloudFormation::Stack",
"Properties": {
"Parameters": {
"RestApiId": { "Ref": "MyRestApi" },
"ResourceId": { "Ref": "HelloResource"}
},
"TemplateURL": "https://s3-eu-west-1.amazonaws.com/my-cloudformation-bucket/api-gateway-cors-headers.json"
}
}