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

Get SQS URL Name from within Serverless function?

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

我可以通过替换

来实现它
    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

如果您查看 SQS::Queue CloudFormation resource,您会发现队列名称已作为属性公开。

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