tl;dr
AWS でサーバレス開発するときによく使う SAM (Serverless Application Model)、いろいろリソースを自動的に作ってくれて便利なんですが、ときどき自動で作成されるリソースの論理 ID がドキュメントされてなくて、自動作成されたリソースが参照できなくて困るときがあります。
そんなときは、 sam deploy
の出力にある LogicalResourceId を見れば論理 ID がわかります。ここに出てるの LogicalResourceId を指定することで、 template.yaml
からそのリソースを参照することができます。
この例の場合 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 が立ち上がります。
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 をみればよいことに気づきました。
ここの値を使うことで、例えば
Outputs:
ApiEndpointURL:
Description: API Endpoint URL
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/${ServerlessRestApi.Stage}/api_endpoint"
といったように、 ServerlessRestApi
を参照して、必要な情報を出すことができます!
余録
まあ、こういうドキュメントをみても論理 ID がわからないものがあれば、ドキュメントに PR を投げる、というのが本筋ではありますが、どう直せばよいかを知るのと、当座の作業を進めるための方法として、残しておきます。
StackOverflow でも困ってる人がいたので、回答しておきました。