[アップデート] AWS SAM CLI でデプロイ前のテンプレートと、デプロイ後のスタック情報を取得出来る sam list コマンドが追加されました

2023.02.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

本日 SAM CLI の v1.72.0 がリリースされました。
いくつか新機能がリリースされているのですが、リリース通知のタイトルにもなっているようにsam listという新しいコマンドが追加されています。

これまでの使い方が大きく変わるような機能ではないのですが、SAM で開発を行う際に少し便利になる機能です。

また、What'new でもsam listコマンドについては取り上げられていたということもあり、このコマンドがどういうものなのか少し使ってみたので紹介したいと思います。

sam list では次の 3 つのサブコマンドが提供されています。

% sam list   
Usage: sam list [OPTIONS] COMMAND [ARGS]...

  Get local and deployed state of serverless application.

Options:
  -h, --help  Show this message and exit.

Commands:
  endpoints      Get a summary of the cloud endpoints in the stack.
  resources      Get a list of resources that will be deployed to...
  stack-outputs  Get the stack outputs as defined in the...

sam list endpoints

こちらは開発中テンプレートを解析して、呼び出し可能な API Gateway エンドポイントと関数 URL を表示するものです。
デプロイ前の場合はメソッドのみ、デプロイ後は--stack-nameオプションを指定することでクラウド上からエンドポイント情報や Physical ID も取得することが出来ます。

% sam list endpoints               
The --stack-name options was not provided, displaying only local template data. To see data about deployed resources, provide the corresponding stack name.
2023-02-04 06:40:12 Loading policies from IAM...
2023-02-04 06:40:14 Finished loading policies from IAM.
Endpoints
-------------------------------------------------------------------------------------------------------------
Resource ID                 Physical ID                 Cloud Endpoints             Methods                   
-------------------------------------------------------------------------------------------------------------
NetCodeWebAPIServerless     -                           -                           -                         
ServerlessHttpApi           -                           -                           /{proxy+}['x-amazon-      
                                                                                    apigateway-any-method'];  
                                                                                    /['x-amazon-apigateway-   
                                                                                    any-method']              
-------------------------------------------------------------------------------------------------------------

「呼び出し可能な」なので、例えば Function に次のように API 定義が含まれていなければエンドポイントの表示はされません。 ただし、関数 URL の場合はスタック情報を指定することでエンドポイントが確認することが出来ました。

template.yml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

:

Resources:
  Function1:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./src/hoge0204sam-dotnet-serverless/
      Handler: hoge0204sam-dotnet-serverless
      Runtime: dotnet6
      MemorySize: 1024

  Function2:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./src/hoge0204sam-dotnet-serverless/
      Handler: hoge0204sam-dotnet-serverless
      Runtime: dotnet6
      MemorySize: 1024
      FunctionUrlConfig:
        AuthType: AWS_IAM
% sam list endpoints
The --stack-name options was not provided, displaying only local template data. To see data about deployed resources, provide the corresponding stack name.
2023-02-04 17:22:37 Loading policies from IAM...
2023-02-04 17:22:43 Finished loading policies from IAM.
Endpoints
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Resource ID                               Physical ID                               Cloud Endpoints                           Methods                                 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Function1                                 -                                         -                                         -                                       
Function2                                 -                                         -                                         -                                       
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

% sam list endpoints --stack-name hoge0204dotnetsam
2023-02-04 17:22:49 Loading policies from IAM...
2023-02-04 17:22:52 Finished loading policies from IAM.
Endpoints
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Resource ID                               Physical ID                               Cloud Endpoints                           Methods                                 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Function1                                 hoge0204dotnetsam-                        -                                         -                                       
                                          Function1-XnB8AWSIeyRQ                                                                                                      
Function2                                 hoge0204dotnetsam-                        https://cenxia6n75grcm6ke2dwb6itii0htcp   -                                       
                                          Function2-k9NmLLu1Ebca                    m.lambda-url.ap-northeast-1.on.aws/                                               
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

ちなみにこちらはコマンド実行時に前処理として自動でsam validateしてくれるのでテンプレートチェックも出来ます。
ただし先日リリースされた--lintオプションなどは使えないので、明らかにテンプレート構文として崩れている場合とかが検出出来るくらいのものでしょうか。

このコマンドはローカルテンプレートを解析するので、前提としてテンプレートファイルが必要です。
デフォルトはカレントディレクトリの template.yml を参照しますが、--template-fileで指定も可能です。

sam list resources

このコマンドはテンプレートを解析してローカルスタック内のリソースを表示することが出来ます。

先程と同様に--stack-nameオプションを指定している場合は、デプロイ済みリソースの Physical ID も表示することが出来ます。

変更セットを作成してエンドポイントや作成リソースの確認をしなくても、今回のコマンドでクラウドへの問い合わせなしでローカルで作成されるリソースのチェックが出来そうです。

デプロイ前

% sam list resources
The --stack-name options was not provided, displaying only local template data. To see data about deployed resources, provide the corresponding stack name.
2023-02-04 07:41:31 Loading policies from IAM...
2023-02-04 07:41:36 Finished loading policies from IAM.
Resources
-------------------------------------------------------------------------------------------------------------
Logical ID                                             Physical ID                                          
-------------------------------------------------------------------------------------------------------------
NetCodeWebAPIServerless                                -                                                    
NetCodeWebAPIServerlessRole                            -                                                    
NetCodeWebAPIServerlessRootResourcePermission          -                                                    
NetCodeWebAPIServerlessProxyResourcePermission         -                                                    
ServerlessHttpApi                                      -                                                    
ServerlessHttpApiApiGatewayDefaultStage                -                                                    
SampleTable                                            -                                                    
-------------------------------------------------------------------------------------------------------------

デプロイ後

% sam list resources --stack-name hoge0204dotnetsam
2023-02-04 07:41:59 Loading policies from IAM...
2023-02-04 07:42:05 Finished loading policies from IAM.
Resources
-------------------------------------------------------------------------------------------------------------
Logical ID                                             Physical ID                                          
-------------------------------------------------------------------------------------------------------------
NetCodeWebAPIServerless                                hoge0204dotnetsam-NetCodeWebAPIServerless-           
                                                       QIvUL3dR4Qza                                         
NetCodeWebAPIServerlessProxyResourcePermission         hoge0204dotnetsam-NetCodeWebAPIServerlessProxyResour 
                                                       cePermission-3NSGT3MQVK38                            
NetCodeWebAPIServerlessRole                            hoge0204dotnetsam-                                   
                                                       NetCodeWebAPIServerlessRole-1TH9J6O02VGUA            
NetCodeWebAPIServerlessRootResourcePermission          hoge0204dotnetsam-NetCodeWebAPIServerlessRootResourc 
                                                       ePermission-14V4O34I6SXEB                            
SampleTable                                            hoge0204sam-dotnet-serverlessBookCatalog             
ServerlessHttpApi                                      loyp0o0cb3                                           
ServerlessHttpApiApiGatewayDefaultStage                $default                                             
-------------------------------------------------------------------------------------------------------------

sam list stack-outputs

このコマンドはローカルテンプレート情報を出力するものではなく、デプロイ済みのスタックを指定して「出力」を表示するものです。

% sam list stack-outputs --stack-name aws-sam-cli-managed-stage1-pipeline-resources
Stack Outputs
------------------------------------------------------------------------------------------------------------------------------------------------------------------
OutputKey                                              OutputValue                                            Description                                          
------------------------------------------------------------------------------------------------------------------------------------------------------------------
PipelineUser                                           arn:aws:iam::123456789012:user/aws-sam-cli-managed-    ARN of the Pipeline IAM User                         
                                                       stage1-pipeline-r-PipelineUser-E9KCKVOVHAYN                                                                 
PipelineUserSecretKey                                  arn:aws:secretsmanager:ap-northeast-1:123456789012:s   AWS Access Key and Secret Key of pipeline user.      
                                                       ecret:PipelineUserSecretKey-DiRwtkntsLkg-CxIAUC                                                             
CloudFormationExecutionRole                            arn:aws:iam::123456789012:role/aws-sam-cli-managed-    ARN of the IAM Role(CloudFormationExecutionRole)     
                                                       stage-CloudFormationExecutionR-J6KU1L8E0MCD                                                                 
ArtifactsBucket                                        arn:aws:s3:::aws-sam-cli-managed-stage1-pipeli-        ARN of the Artifacts bucket                          
                                                       artifactsbucket-gx43qsrp0wlx                                                                                
PipelineExecutionRole                                  arn:aws:iam::123456789012:role/aws-sam-cli-managed-    ARN of the IAM Role(PipelineExecutionRole)           
                                                       stage1-p-PipelineExecutionRole-NN58Z19XOUOF                                                                 
------------------------------------------------------------------------------------------------------------------------------------------------------------------

背景としては、スタック作成後に出力されるエンドポイントやリソース情報などをチーム内などで共有する際にsam deploy時以外に取得する方法がありませんでした。
そのため、これまではマネジメントコンソールの出力タブを確認するか、次のように AWS CLI で加工しつつ取得する必要がありました。

% aws cloudformation describe-stacks --stack-name hoge0204dotnetsam | jq ".Stacks[0].Outputs"
[
  {
    "OutputKey": "WebEndpoint",
    "OutputValue": "https://loyp0o0cb3.execute-api.ap-northeast-1.amazonaws.com/",
    "Description": "API Gateway endpoint URL"
  }
]

このあたりが SAM CLI のみで簡単に取得出来るようになったよ、ということのようです。
参考 Issue はこのあたりです。

出力フォーマットは既定のテーブル形式以外に JSON も

今回の 3 つのサブコマンド全てで出力形式を指定することが出来ます。
テーブルか JSON かを指定することが出来て、省略時はデフォルトとしてテーブルで動作します。

JSON

% sam list stack-outputs --stack-name hoge0204dotnetsam --output json
[
  {
    "OutputKey": "WebEndpoint",
    "OutputValue": "https://loyp0o0cb3.execute-api.ap-northeast-1.amazonaws.com/",
    "Description": "API Gateway endpoint URL"
  }
]

テーブル

% sam list stack-outputs --stack-name hoge0204dotnetsam --output table
Stack Outputs
------------------------------------------------------------------------------------------------------------
OutputKey                            OutputValue                          Description                        
------------------------------------------------------------------------------------------------------------
WebEndpoint                          https://loyp0o0cb3.execute-api.ap-   API Gateway endpoint URL           
                                     northeast-1.amazonaws.com/                                              
------------------------------------------------------------------------------------------------------------

さいごに

本日は AWS SAM CLI に新しく追加されたsam listコマンドについて確認してみました。

過去のアップデートであったsam pipelinesam syncのように開発方法が変わる、というようなコマンドではないのかもしれませんが、色々なシーンで気軽に使える便利なコマンドという感じでしょうか。
覚えておくと良さそうです。