В каком формате указывается идентификатор ApiId внешнего ПОГРАНИЧНОГО шлюза в шаблонах CloudFormation?

#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 в свои шаблоны, спасибо 🙂