これは、なにをしたくて書いたもの?
こちらのエントリーのちょっとした切り出しです。
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.yml
のresources
の配下にResources
、Outputs
を配置して、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
使えったっけ?どうだったっけ?と思ったりすることがあるので、メモとして。