#amazon-cloudformation #aws-api-gateway
#amazon-cloudformation #aws-api-gateway
Вопрос:
Я пытаюсь создать или обновить стек с помощью следующего шаблона CloudFormation:
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
ApiGatewayId:
Type: String
ApiLayerArn:
Type: String
JarLocation:
Type: String
Resources:
Function:
Type: 'AWS::Lambda::Function'
Properties:
Handler: net.bitsandpaper.api.kiosk.PlatformChecker
Runtime: java11
Code:
S3Bucket: bnp-build-artifacts
S3Key: !Ref JarLocation
Description: ''
MemorySize: 128
Timeout: 5
Role: arn:aws:iam::479832603967:role/bnp-api-lambda-execution-role
Layers:
- !Ref ApiLayerArn
ApiIntegration:
Type: AWS::ApiGatewayV2::Integration
Properties:
ApiId: !Ref ApiGatewayId
IntegrationType: AWS_PROXY
IntegrationUri: !Join
- ''
- - 'arn:'
- !Ref 'AWS::Partition'
- ':apigateway:'
- !Ref 'AWS::Region'
- ':lambda:path/2015-03-31/functions/'
- !Ref Function
- /invocations
TimeoutInMillis: 6000
ApiRoute:
Type: AWS::ApiGatewayV2::Route
Properties:
ApiId: !Ref ApiGatewayId
RouteKey: 'GET /kiosk/platform-check'
Target: !Join
- /
- - integrations
- !Ref ApiIntegration
Параметры правильно передаются внешним файлом, они хорошо выглядят в веб-консоли, в частности, параметр ApiGatewayId
имеет значение 8548rqrsm5
. Тем не менее, во время развертывания у меня есть CREATE_FAILED
for ApiIntegration
с сообщением:
Неверный идентификатор API, указанный 479832603967:8548rqrsm5 (Сервис: AmazonApiGatewayV2; Код состояния: 404; Код ошибки: NotFoundException; Идентификатор запроса: 84918a83-cf9d-48d2-acf7-18d9d2e4d330; Прокси: null)
API — это ПОГРАНИЧНЫЙ Rest API, расположенный в том же регионе, что и стек CloudFormation. Идентификатор извлекается CLI с aws apigateway get-rest-apis
помощью .
Я что-то упускаю в формате ApiId? Литература очень скудна, если не ссылаться на API в том же стеке…
Ответ №1:
AWS::ApiGatewayV2
только для типов WEBSOCKTE и HTTP. Из документов:
Протокол API. Допустимыми значениями являются WEBSOCKET или HTTP.
Но поскольку вы пишете о Edge-optimized
(не поддерживается HTTP api), кажется, что вы используете REST API, а не HTTP API. Итак, вы должны использовать ресурсы AWS ::APIGateway, а не AWS::ApiGatewayV2
.
Комментарии:
1. Это была моя проблема, спасибо. Это плохое именование со стороны AWS…
2. @SilverQuettier Нет проблем. Рад, что смог помочь.
Ответ №2:
Похоже, что WS ::ApiGatewayV2::Route создается перед AWS ::ApiGatewayV2::Integration. Поэтому, когда он пытается сослаться на ApiIntegration, он еще не создан.
Поэтому вам следует попробовать использовать атрибут dependsOn.
С помощью атрибута dependsOn вы можете указать, что создание определенного ресурса следует за другим. Когда вы добавляете атрибут dependsOn к ресурсу, этот ресурс создается только после создания ресурса, указанного в атрибуте dependsOn.
Попробуйте это ниже кода CloudFormation:
ApiRoute:
Type: AWS::ApiGatewayV2::Route
DependsOn: ApiIntegration
Properties:
ApiId: !Ref ApiGatewayId
RouteKey: 'GET /kiosk/platform-check'
Target: !Join
- /
- - integrations
- !Ref ApiIntegration
Я надеюсь, что это поможет вам решить вашу проблему.
Ссылка: Атрибут пользователя dependsOn
Комментарии:
1. Спасибо, что указали на это, Абдул, это определенно поможет в будущем, к сожалению, здесь это не проблема. Однако я добавил инструкции dependsOn в свои шаблоны, спасибо 🙂