Как правильно настроить APIGateway для CORS с помощью CDK

#typescript #amazon-web-services #amazon-cloudformation #aws-api-gateway #aws-cdk

Вопрос:

У меня есть API, предоставляемый AWS APIGateway, поддерживаемый функцией AWS Lambda и подготовленный с использованием CDK. API был настроен с настройками CORS по умолчанию:

 const api = new apiGateway.RestApi(this, "comments-api", {
  defaultCorsPreflightOptions: { allowOrigins: apiGateway.Cors.ALL_ORIGINS }
})

const comments = api.root.addResource("comments")

const comment = comments.addResource("{post_slug}")

comment.addMethod("GET", new apiGateway.LambdaIntegration(listCommentsFunction))
 

Похоже, что это обеспечивает только часть конфигурации CORS для моего API.

  • Он предоставляет ответ на OPTIONS запрос с соответствующими заголовками, связанными с CORS, но
  • Похоже, он НЕ увлажняет ответ на запрос GET <api>/comments/{post_slug} соответствующими заголовками CORS

Это делает параметры CORS конфигурации в конструкции CDK не особенно полезными, поскольку мне кажется более разумным игнорировать этот параметр и вместо этого вручную настроить ответ ПАРАМЕТРОВ из моей Лямбды, изменив его на этот:

 const api = new apiGateway.RestApi(this, "comments-api")

const comments = api.root.addResource("comments")
const comment = comments.addResource("{post_slug}")

comment.addMethod("GET", new apiGateway.LambdaIntegration(listCommentsFunction))
comment.addMethod("OPTIONS", new apiGateway.LambdaIntegration(listCommentsFunction))
 

А затем убедитесь, что моя лямбда всегда отвечает правильными заголовками. Если я этого не сделаю, то я буду заполнять свои ответы заголовками CORS, используя два разных механизма: конфигурацию стека CDK и логику явного обработчика. Это похоже на запах.

По этой причине мне интересно, не неправильно ли я что-то настраиваю, и есть способ использовать CDK для настройки правильного увлажнения ответа.

Ответ №1:

Сгенерированный CDK код для OPTIONS метода использует переопределения ответов — https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-override-request-response-parameters.html

Этот параметр недоступен в интеграции лямбда-прокси, которую вы используете для метода GET. Я действительно не нашел другого варианта, кроме как вычислить заголовки CORS на уровне исходного кода lambda.

P.S.: Я написал https://milangatyas.com/Blog/Detail/14/setup-cors-for-amazon-api-gateway-via-aws-cdk где вы можете получить более подробную информацию.