Назад | Перейти на главную страницу

Как передать параметры во вложенный стек в Amazon CloudFormation?

Я использую 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"
      }
    }