Search code examples
serverless-frameworkserverlessaws-serverless

Get SQS URL Name from within Serverless function?


I would like to grab the name of the serverless function. Here is my code. What I am trying to achieve is, instead of arn https://sqs.us-east-1.amazonaws.com/xxxx/channels.fifo, I want to the env SQS_URL to be set to channels.fifo. I looked at Fn::Split fucntion of cloudformation, but was unable to properly use it to set it on 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

Solution

  • If you take a look at the SQS::Queue CloudFormation resource you can see that the Queue Name is exposed as an attribute.

    As a result of that you can use: !GetAtt sqsQueue.QueueName or Fn::GetAtt [sqsQueue, QueueName], both of which may be a little easier to read than the solution you came up with (which still works).