0

Мы пытаемся автоматизировать развертывание шлюза AWMS лямбда и API с помощью Amazon CloudFormation и Swagger. К этому мы создали шаблон CloudFormation для создания Lambda и других ресурсов, необходимых для APIGateway (включая конечные точки). Мы хотели бы импортировать определения API из внешнего файла swagger, чтобы один и тот же шаблон CloudFormation мог использоваться для нескольких lambdas и APIGateways. Есть ли способ, которым мы можем ссылаться на ARN лямбда, которая была создана шаблоном CloudFormation во внешнем файле swagger (упоминается в том же шаблоне CloudFormation), который содержит определение API?Передача ссылки ARN от CloudFormation до Swagger

содержание Сваггера:

"x-amazon-apigateway-integration": { 
       "uri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:TestSimpleProxy/invocations", 
       "passthroughBehavior": "when_no_match", 
       "httpMethod": "POST", 
       "type": "aws_proxy" 
      } 

В описанном выше способе интеграции, мне нужно динамически заменить значение Ури из шаблона формирования облака.

Мое образование облаков сценарий, как показано ниже:

"myApi":{ 
     "Type" : "AWS::ApiGateway::RestApi", 
     "Properties" : { 
     "BodyS3Location" : S3Location of the swagger definition file, 
     .., 
     .. 
     } 
    } 

ответ

0

Это "x-amazon-apigateway-integration" часть шаблона CloudFormation?

Если да, то, следуя примеру от https://blog.jayway.com/2016/09/18/introduction-swagger-cloudformation-api-gateway/, я думаю, вы можете использовать функцию Ref, чтобы передать эту информацию.

+0

благодарит за ответ. Указанный пример работает только в том случае, если мы строго кодировали определение swagger с самим шаблоном формирования облаков. Если я попытаюсь импортировать его из внешнего файла. Это вызывает недопустимую ошибку ARN. –

+0

Можете ли вы поделиться полным примером шаблона CloudFormation, демонстрирующего ошибку? –

0

Я просто побежал в то же препятствие ... Это НЕ простой ответ, но обходной путь, чтобы автоматизировать разрешение лямбда ARN, что вы хотите использовать в шаблоне развязность; он работает для меня. Здесь идет ...

  1. Экспорт Лямбда ARN в шаблоне CF, который создает ваш Lambda и которые вы хотите, чтобы позже использовать в шаблоне развязность, например,

    Outputs: 
        MyLambdaARN: 
        Value: !Ref "LambdaFuncThatIsDefinedInTheTemplate" 
        Export: 
         Name: !Sub "${AWS::StackName}-LambdaARN" 
    
  2. Обратитесь к лямбда-ARN Экспорт в шаблоне развязность - На месте ARN для лямбда введите сменного маркера, который включает имя экспорта, начиная с шага 1, например " MyLambdaStack-LambdaARN ", если ваш стек с шага 1 был создан как« MyLambdaStack ».

    • Для маркера синтаксиса давайте использовать то, что мы желаем на самом деле работали, то ImportValue function поэтому наш маркер становится !ImportValue(MyLambdaStack-LambdaARN).
    • В нашем шаблоне развязности, расширение интеграции использует наш маркер, как это:

      x-amazon-apigateway-integration: 
          passthroughBehavior: "when_no_match" 
          uri: "!ImportValue(MyLambdaStack-LambdaARN)" 
          httpMethod": "POST" 
          type: "AWS-PROXY" 
      
  3. Заменить токен с Actual Lambda ARN - Мы будем использовать следующий скрипт для замены !ImportValue(MyLambdaStack-LambdaARN) маркеров с фактической Лардской АРН нам там нужно.

    #!/bin/bash 
    SWAGGER_FILE=$1 
    
    REPLACEMENTS=$(\ 
        aws cloudformation list-exports --query 'Exports[*].[Name,Value]'\ 
        | awk '{print "s/!ImportValue(" $1 ")/" $2 "/g"}' ORS='; '\ 
    ) 
    
    sed "$REPLACEMENTS" "$SWAGGER_FILE" 
    

    Вот что делает этот сценарий

    1. Хватает список экспорта стека с использованием aws cloudformation list-exports
    2. Фильтры для только имя экспорта и значение с --query 'Exports[*].[Name,Value]' аргументом
    3. Форматы экспорта в виде строки заменителей sed, которые заменят значение токена фактической экспортной стоимостью awk '{print "s/!ImportValue(" $1 ")/" $2 "/g"}' ORS='; '
    4. Наконец, использует sed, чтобы сделать замену в файле swagger в качестве первого аргумента скрипту.

    Например, если вы создали этот сценарий как resolve-arns.sh вы могли бы вызвать его следующим образом:

    ./resolve-arns.sh swagger.yml > resolved-swagger.yml 
    
  4. Ссылка устраненных определение Кураж - Наконец, вы бы ссылку на файл resolved-swagger.yml в CF-шаблон, который вы используете для создания вашего API, например BodyS3Location: resolved-swagger.yml

ПРЕДОСТЕРЕЖЕНИЕ:

  1. Конечно, aws инструментов командной строки должны быть доступны и настроены
  2. Этой реализация не является достаточно сложной для обработки региона аргумента AWS ... но он может быть изменен для этого
  3. Это скрипт bash ... если вы находитесь на другой ОС, такой как окна, то такой же подход должен работать, но реализация wo ÜLD быть различными (я бы начать с PowerShell, вероятно, ...)
1

Там другая, менее сложный подход. Если вы используете свойство Body вместо BodyS3LocationAWS::ApiGateway::RestApi, вы можете использовать Cloud Formation Instrinsic Functions, чтобы ссылаться или динамически наращивать ARN, который вы хотите в шаблоне swagger.

... конечно, недостатком является то, что ваш шаблон swagger встроен в сценарий CF, а не в отдельный файл.

4

Новое решение:

Теперь можно использовать новый AWS::Include Transform ссылаться на загруженном шаблон непосредственно из шаблона CloudFormation:

Api: 
    Type: AWS::ApiGateway::RestApi 
    Properties: 
    Body: 
     Fn::Transform: 
     Name: AWS::Include 
     Parameters: 
      Location: !Sub s3://${ArtifactsBucket}/swagger.yaml 

где ArtifactsBucket относится к ковшу, где вы загружаете Swagger перед созданием или обновлением стека. Затем в шаблоне Swagger вы можете использовать встроенные функции, например.

x-amazon-apigateway-integration: 
    type: aws_proxy 
    httpMethod: POST 
    uri: 
    Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaFunction.Arn}/invocations 

Здесь я использую длинные Fn::Sub обозначения вместо просто !Sub, потому что Сваггер изначально не поддерживает последних, а также потому, что документы на AWS::Include Transform говорят, что сокращенные формы пока не поддерживаются.

Вы также можете использовать AWS::Serverless::Api и DefinitionBody, если используете SAM.

Старые обходной путь:

Другое (несколько Hacky, но простое) решения перечислить Апи как последний ресурс в шаблоне CloudFormation и указать пустое тело с : !Sub |- в конце.

Затем вы можете связать этот шаблон с фактическим файлом Swagger и указать любые параметры, используя стандартный синтаксис ${} в этом файле.

Единственное незначительное осложнение заключается в том, что вы должны правильно отступать от файла Swagger при конкатенации его при использовании YAML (этот подход не будет работать для шаблонов JSON, хотя вам придется заменить Body на что-то вроде jq если вы их используете).

+1

Официальную документацию, на которую вы ссылаетесь, трудно понять, если не сказать больше. Спасибо за ясный пример. –