CLOVER🍀

That was when it all began.

Serverless FrameworkでAWS CloudFormationのリソース定義をしたり、値を参照したりする

これは、なにをしたくて書いたもの?

こちらのエントリーのちょっとした切り出しです。

LocalStack内のAWS Lambda関数から、LocalStackで動作している別のAWSリソースにアクセスするにはLOCALSTACK_HOSTNAME環境変数を使う - CLOVER🍀

内容的には独立しておいた方が、自分にとって探しやすいかなということで。

環境

Serverless Frameworkのバージョンは、以下を使って確認しています。

$ npx serverless --version
Framework Core: 3.33.0 (local)
Plugin: 6.2.3
SDK: 4.3.2

元のエントリーと同じなのですが。

Serverless FrameworkでAWS CloudFormationスタックにリソースを追加する

serverless.ymlresourcesの配下にResourcesOutputsを配置して、AWS CloudFormationスタックにリソースを追加したりできます。

Serverless Framework - AWS Infrastructure Resources

元のエントリーでは、以下のようなserverless.ymlを作成しました。

serverless.yml

service: access-aws-resource-in-localstack-lambda

frameworkVersion: "3"

provider:
  name: aws
  runtime: nodejs18.x
  stage: dev
  region: us-east-1

package:
  individually: true

functions:
  subscribeSqs:
    handler: subscribe-sqs/handler.handler
    events:
      - sqs:
          arn: !GetAtt MyQueue.Arn

resources:
  Resources:
    MyQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: my-queue

custom:
  esbuild:
    bundle: true
    target: node18
    platform: node

plugins:
  - serverless-esbuild
  - serverless-localstack

この時に、Amazon SQSキューをAWS CloudFormationのリソース定義で作成しています。

resources:
  Resources:
    MyQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: my-queue

またAWS CloudFormationスタックのOutput${cf:〜}で参照することもできるようです。

   
service: new-service
provider: aws
functions:
  hello:
    name: ${cf:another-service-dev.functionPrefix}-hello
    handler: handler.hello
  world:
    name: ${cf:another-stack.functionPrefix}-world
    handler: handler.world

Variables / Reference CloudFormation Outputs

Serverless FrameworkでAWS CloudFormationの組み込み関数を使う

serverless.yml内で、AWS CloudFormationの組み込み関数を使うことができます。

組み込み関数リファレンス - AWS CloudFormation

たとえば、以下のserverless.ymlではFn::GetAtt関数を使用しています。

serverless.yml

service: access-aws-resource-in-localstack-lambda

frameworkVersion: "3"

provider:
  name: aws
  runtime: nodejs18.x
  stage: dev
  region: us-east-1

package:
  individually: true

functions:
  subscribeSqs:
    handler: subscribe-sqs/handler.handler
    events:
      - sqs:
          arn: !GetAtt MyQueue.Arn

resources:
  Resources:
    MyQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: my-queue

custom:
  esbuild:
    bundle: true
    target: node18
    platform: node

plugins:
  - serverless-esbuild
  - serverless-localstack

AWS CloudFormationのリソース定義したものを、!GetAttで参照している形ですね。

functions:
  subscribeSqs:
    handler: subscribe-sqs/handler.handler
    events:
      - sqs:
          arn: !GetAtt MyQueue.Arn

resources:
  Resources:
    MyQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: my-queue

ドキュメントを見ていても、このようなサンプルはいくつかあります。

functions:
  dispatcher:
    handler: dispatcher.dispatch
    events:
      - sns:
          arn:
            Fn::Join:
              - ':'
              - - 'arn:aws:sns'
                - Ref: 'AWS::Region'
                - Ref: 'AWS::AccountId'
                - 'MyCustomTopic'
          topicName: MyCustomTopic

SNS / Using a pre-existing topic

functions:
  compute:
    handler: handler.compute
    events:
      # These are all possible formats
      - sqs: arn:aws:sqs:region:XXXXXX:MyFirstQueue
      - sqs:
          arn:
            Fn::GetAtt:
              - MySecondQueue
              - Arn
      - sqs:
          arn:
            Fn::ImportValue: MyExportedQueueArnId
      - sqs:
          arn:
            Fn::Join:
              - ':'
              - - arn
                - aws
                - sqs
                - Ref: AWS::Region
                - Ref: AWS::AccountId
                - MyOtherQueue

Serverless Framework - AWS Lambda Events - SQS Queues

   
functions:
  compute:
    handler: handler.compute
    events:
      # These are all possible formats
      - msk:
          arn: arn:aws:kafka:region:XXXXXX:cluster/MyCluster/xxxx-xxxxx-xxxx
          topic: mytopic
      - msk:
          arn:
            Fn::ImportValue: MyExportedMSKClusterArn
          topic: mytopic
      - msk:
          arn: !Ref MyMSKCluster
          topic: mytopic

MKS / Simple event definition

使えったっけ?どうだったっけ?と思ったりすることがあるので、メモとして。