从无服务器功能中获取 SQS URL 名称?

问题描述

我想获取无服务器函数名称。这是我的代码。 我想要实现的是,我希望将 env https://sqs.us-east-1.amazonaws.com/xxxx/channels.fifo 设置为 SQS_URL,而不是 arn channels.fifo。我查看了 cloudformation 的 Fn::Split fucntion,但无法正确使用它在 env 上进行设置。

functions:
  S3ToSqs:
    handler: lambda_function.lambda_handler
    role: S3ToSqsLambdaRole
    memorySize: 128
    timeout: 5
    events:
      - schedule:
          name: 'S3ToSqsCronEvent'
          rate: rate(1 minute)
          enabled: true
    environment:
      SQS_URL:
        Ref: sqsQueue
      REGION: 'us-east-1'

resources:
  Resources:
    S3ToSqsLambdaRole:
      Type: AWS::IAM::Role
      Properties:
        AssumeRolePolicyDocument:
          Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
                - events.amazonaws.com
            Action: 
            - sts:AssumeRole
        Policies:
          - PolicyName: S3ToSqsRole
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Action:
                    - logs:CreateLogGroup
                    - logs:CreateLogStream
                    - logs:PutLogEvents
                    - sqs:DeleteMessage
                    - sqs:GetQueueUrl
                    - sqs:ChangeMessageVisibility
                    - sqs:SendMessageBatch
                    - sqs:ReceiveMessage
                    - sqs:SendMessage
                    - sqs:GetQueueAttributes
                    - sqs:ListQueueTags
                    - sqs:ListDeadLetterSourceQueues
                    - sqs:DeleteMessageBatch
                    - sqs:PurgeQueue
                    - sqs:DeleteQueue
                    - sqs:CreateQueue
                    - sqs:ChangeMessageVisibilityBatch
                    - sqs:SetQueueAttribute
                    - s3:GetobjectVersion
                    - s3:Getobject
                    - s3:ListBucket
                  Resource: "arn:aws:logs:*:*:*"
    sqsQueue:
      Type: "AWS::SQS::Queue"
      Properties:
        ContentBasedDeduplication: true
        FifoQueue: true
        QueueName: "channels.fifo"

#Package used from https://github.com/arabold/serverless-export-env
plugins:
  - serverless-export-env

解决方法

如果您查看 SQS::Queue CloudFormation resource,您可以看到队列名称作为属性公开。

因此,您可以使用:!GetAtt sqsQueue.QueueNameFn::GetAtt [sqsQueue,QueueName],这两者可能比您提出的解决方案(仍然有效)更容易阅读。

,

我能够通过替换来实现它

    environment:
      SQS_URL:
        Ref: sqsQueue
      REGION: 'us-east-1'

部分与

    environment:
      SQS_URL: !Select [4,!Split ["/",!Ref sqsQueue ]]

现在给我的输出是 channels.info 而不是 https://sqs.us-east-1.amazonaws.com/xxxx/channels.fifo