【手を動かしながら学ぶ】AWS SAM CLI のはじめの一歩

記事タイトルとURLをコピーする

こんにちは、サービス開発部のくればやしです。

今回はAWS SAM CLI(SAM CLI)のはじめの一歩をコマンドを実行しながら学んでいきたいと思います。

私自身、はじめてSAMコマンドを触った際、 sam init? --guided ? samconfig? となってしまい、それらの関係がよく分からなかったので、まず基本の使い方として deploy コマンドの使い方をおさえておくと分かりやすいと思いましたので、そこの解説をしていきたいと思います。

本記事で確認したSAM CLIのVersionは SAM CLI, version 1.145.1 です。

その前に:AWS SAM と SAM CLI の関係

SAM CLIの使い方の前に、まず初めて学んだ時は「AWS SAM」と「SAM CLI」の関係が分かりづらいかもしれません。

AWS SAMは AWS CloudFormation の拡張機能であり、SAMを利用することでCloudFormationのテンプレートをより完結に定義できます。例えば、以下のようにLambda関数を定義するテンプレートを非常に完結に定義できます。

SAMテンプレート SAMテンプレート

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  deploy-test

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: s3://xxxxx/xxxxxx
      Handler: app.lambda_handler
      Runtime: python3.13
      Architectures:
        - x86_64

上記のSAMテンプレートが変換されたCloudFormationテンプレート

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "deploy-test\n",
  "Resources": {
    "HelloWorldFunction": {
      "Type": "AWS::Lambda::Function",
      "Metadata": {
        "SamResourceId": "HelloWorldFunction"
      },
      "Properties": {
        "Code": {
          "S3Bucket": "xxxxxxx",
          "S3Key": "xxxxxxxx"
        },
        "Handler": "app.lambda_handler",
        "Role": {
          "Fn::GetAtt": [
            "HelloWorldFunctionRole",
            "Arn"
          ]
        },
        "Runtime": "python3.13",
        "Tags": [
          {
            "Key": "lambda:createdBy",
            "Value": "SAM"
          }
        ],
        "Architectures": [
          "x86_64"
        ]
      }
    },
    "HelloWorldFunctionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Action": [
                "sts:AssumeRole"
              ],
              "Effect": "Allow",
              "Principal": {
                "Service": [
                  "lambda.amazonaws.com"
                ]
              }
            }
          ]
        },
        "ManagedPolicyArns": [
          "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
        ],
        "Tags": [
          {
            "Key": "lambda:createdBy",
            "Value": "SAM"
          }
        ]
      }
    }
  }
}

また、このSAMテンプレートは SAM CLI を利用しなくてもマネジメントコンソール等でデプロイ出来ます。マネジメントコンソールで上述のSAMテンプレートをデプロイすると、SAMテンプレートとCloudFormationのテンプレートの変換前後を確認できます。

SAM CLI では手元のSAMテンプレートをデプロイできますが、素のCloudFormationテンプレートもデプロイできます。

すなわち、SAM CLIはAWS SAM(テンプレート)の利用に便利(現実的な運用を考えると必須*1)なものではあるものの、機能としては独立して使えうるものと捉えることができます。

SAM CLI(sam deploy)の使い方

それでは SAM CLI(コマンド)の使い方を確認していきたいと思います。

sam init コマンドを使うことでサンプルアプリケーションの構築や設定ファイル( samconfig.toml )の作成が可能ですが、最終的に利用することになるデプロイコマンド( sam deploy ) の使い方を先に確認する方がイメージを掴みやすいと思いますので、今回は deploy コマンドの使い方を確認していきます。

前述のように SAM CLI では素のCloudFormationテンプレートのデプロイも可能ですので、簡単なサンプルとしてS3バケットを1つ作成するテンプレートを用意し、これのデプロイを試みていきます。

AWSTemplateFormatVersion: '2010-09-09'
Description: deploy-test

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket

まず何も考えずに sam deploy コマンドを実行すると以下のようにエラーになるはずです。

Error: Missing option '--stack-name', 'sam deploy --guided' can be used to provide and save needed parameters for future deploys.

デプロイにはスタック名の指定が必須であることが分かります。スタック名を指定してデプロイしてみます。するとデプロイに成功します。

sam deploy --stack-name test-deploy 

ところで先ほど「スタック名を指定するか、 --guided を指定しなさい」と出力されていた --guided とは何でしょうか? これを指定して sam deploy コマンドを実行すると、対話的なプロンプトが開始され、各オプションの簡単な説明を確認しながらコマンドの実行を進めることができます。そのときにスタック名を指定できるため、直接スタック名を指定しなくてもデプロイすることが可能になるというわけです。

sam deploy --guided 

Configuring SAM deploy
======================

        Looking for config file [samconfig.toml] :  Not found

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]:

また、上記のメッセージに Looking for config file [samconfig.toml] : Not found とあるように samconfig.toml という設定ファイルをコマンド実行時のディレクトリに配置しておき、その設定ファイルにスタック名を書いておくことでもスタック名の指定が可能です。

version = 0.1

[default]
[default.global]
[default.global.parameters]
stack_name = "sam-app"

まとめ

つまり、sam deploy コマンドではスタック名の指定が必須であり、スタック名の指定方法には以下の3つの方法があるということになります。

  • コマンドの引数で直接渡す:sam deploy --stack-name <スタック名>
  • 対話プロンプトで指定する:sam deploy --guided
  • 設定ファイルにあらかじめ書いておく:samconfig.toml

これでSAM CLIのコマンドのパラメータと、 --guided オプションと、 設定ファイルである samconfig.toml の関係性が見えてきたと思います。スタック名に限らず、他のパラメータも同様に指定することが出来ますので、適宜指定方法を使い分けていくことになると思います。

おわりに

今回 SAM CLI の基本について deploy コマンドを例にご紹介しました。 どなたかの一助になれば幸いです。

関連

blog.serverworks.co.jp

blog.serverworks.co.jp

[AWS Black Belt Online Seminar]AWS Serverless ApplicationModel (AWS SAM)

*1:前述の例のAWS::Serverless::Functionはコードの場所にS3バケットを指定しましたが、実際はテンプレートファイルと一緒にリポジトリ内で管理するコードを指定すると思います。その場合はCodeUri: ./srcのようにパスを指定することになりますが、このように指定した場合はSAM CLIを使ったデプロイが必須となります

紅林輝(くればやしあきら)(サービス開発部) 記事一覧

サービス開発部所属。2015年にサーバーワークスにJOIN。クラウドインテグレーション部を経て、現在はCloud Automatorの開発に従事。ドラクエ部。推しナンバーはⅤ、推しモンスターはクックルー。