LoginSignup
0
0

More than 3 years have passed since last update.

SAM が自動生成するリソースの調べ方

Posted at

tl;dr

AWS でサーバレス開発するときによく使う SAM (Serverless Application Model)、いろいろリソースを自動的に作ってくれて便利なんですが、ときどき自動で作成されるリソースの論理 ID がドキュメントされてなくて、自動作成されたリソースが参照できなくて困るときがあります。

そんなときは、 sam deploy の出力にある LogicalResourceId を見れば論理 ID がわかります。ここに出てるの LogicalResourceId を指定することで、 template.yaml からそのリソースを参照することができます。

image.png

この例の場合 AWS::ApiGateway::RestApi が自動で作られたリソースなんですが、その ID が "ServerlessRestApi" というのがわかる、という寸法です。

LogicalResourceId は、 sam deploy の出力に加えて、 AWS マネジメントコンソールからも見ることができます。

細かい説明

AWS SAM?

AWS が提供している Serverless Application Model (SAM) は、サーバレス開発で使うリソースのデプロイを宣言的に書くための仕組みです。 AWS で Infrastruture as Code を実現する仕組みである CloudFormation の拡張として実装されています。SAM を使うと、簡単な定義で Lambda や APIGateway など、必要なリソースをいろいろと立ち上げてくれて、けっこう便利です。

自動生成リソースと、まれにある困ったこと

この自動で作られるリソースをテンプレート内で参照したい場合、基本的にはドキュメントにかかれているので、その値を使えばよいのですが、たまーにリソース名がドキュメントに書かれていないものがあります。

たとえば下記のような template.yaml を用意して、sam-cli を実行することで、Lambda 関数に加えて、API Gateway の RestApi や、実行に必要なロールなど諸々のリソースが一発で作ってくれ、 https://......./api_endpoint という Web API が立ち上がります。

template.yaml
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: CloufFormation Template for project_name

Resources:
  EndPointFunction:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: python3.8
      CodeUri: src
      Handler: lambda_handler.lambda_handler
      Events:
        API:
          Type: Api
          Properties:
            Path: /api_endpoint
            Method: post

このとき、実際に生成された API のフルパスを出力しようとすると、API Gateway の RestApi リソースを参照する必要があるのですが、SAM のドキュメント には a default AWS::Serverless::Api resource is created とあるのみで、テンプレート内から参照するための論理 ID は書かれていません(2020/11 現在)

これまで、どうやって自動で作られるリソースを参照したいときにどうすればいいのか途方に暮れてしまい、手動でリソースを作るようにしていたのですが、、、

解決策

ある日、LogicalResourceId をみればよいことに気づきました。

ここの値を使うことで、例えば

template.yaml
Outputs:
  ApiEndpointURL:
    Description: API Endpoint URL
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/${ServerlessRestApi.Stage}/api_endpoint"

といったように、 ServerlessRestApi を参照して、必要な情報を出すことができます!

余録

まあ、こういうドキュメントをみても論理 ID がわからないものがあれば、ドキュメントに PR を投げる、というのが本筋ではありますが、どう直せばよいかを知るのと、当座の作業を進めるための方法として、残しておきます。

StackOverflow でも困ってる人がいたので、回答しておきました

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0