AWS SAM - Как объединить переменные стадии с Fn :: Sub в uri конечной точки swagger - PullRequest
0 голосов
/ 05 мая 2020

У нас есть стек, который использует вывод другого стека с перекрестными ссылками с использованием Fn::ImportValue в теле определения swagger.

Примечание: другие части опущены для сокращения кода

SampleApi:
  Type: AWS::Serverless::Api
  Properties:
    StageName: Stage
    Variables:
      SampleFunctionName:
        Fn::ImportValue: 
          !Sub ${OtherStackName}-SampleFunctionName
    DefinitionBody:
      swagger: 2.0
      paths:
        /sample:
          get:
            x-amazon-apigateway-integration:
              uri:
                Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${stageVariables.SampleFunctionName}/invocations

Где ${OtherStackName}-SampleFunctionName - это имя функции, которая импортируется из другого стека.

Теперь наша проблема в том, что мы не можем поместить его в uri конечной точки. Cloudformation жалуется на это во время развертывания sam, говоря, что ${stageVariables.SampleFunctionName} является недопустимым атрибутом внутри Fn :: Sub.

Я пробовал несколько способов, включая размещение всего uri в самой переменной stage, но все же он не приходит.

Ваши мысли очень признательны!

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Fn :: Sub поддерживался начиная с версии v0.21.0 SAM CLI. Версии ниже 0.21.0 не поддерживают большинство функций Cloudformation Intrinsi c.

Для получения дополнительных сведений см. Ссылку ниже:

https://github.com/awslabs/aws-sam-cli/issues/528

https://github.com/awslabs/aws-sam-cli/releases/tag/v0.21.0

Если вы используете версию ниже упомянутой, вы можете попробовать использовать Fn :: Join вместо Fn :: Sub в качестве рабочего процесса

                uri: !Join
                      - ''
                      - - 'arn:aws:apigateway:'
                        - !Ref "AWS::Region"
                        - ':lambda:path/2015-03-31/functions/arn:aws:lambda:'
                        - !Ref "AWS::Region"
                        - ':'
                        - !Ref "AWS::AccountId"
                        - ':function:${stageVariables.SampleFunctionName}/invocations'

0 голосов
/ 08 мая 2020

Я сделал так, чтобы это работало

x-amazon-apigateway-integration:
  uri:
    Fn::Join:
      - ''
      - - Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/
        - Fn::ImportValue: 
            Fn::Sub: ${StackName}-FunctionArn
        - /invocations

По некоторым причинам сокращенные функции не работают внутри uri и ${stageVariables.<somename>} не работают внутри функции Fn :: Sub.

Обратите внимание, что это происходит только внутри тела определения swagger

...