🫣

[AWS SAM]Hello World Example template.yamlの内容を見てみよう

2023/06/15に公開

はじめに


AWS SAMを使ってみた!感動した!
で作成した環境のHello World Example template.yamlの内容を1つ1つ見てみます。

動作環境

macOS Monterey 12.6.5

template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  todo-app

  Sample SAM Template for todo-app

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3
    MemorySize: 128

    Tracing: Active
  Api:
    TracingEnabled: true
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
      - x86_64
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get

  ApplicationResourceGroup:
    Type: AWS::ResourceGroups::Group
    Properties:
      Name:
        Fn::Sub: ApplicationInsights-SAM-${AWS::StackName}
      ResourceQuery:
        Type: CLOUDFORMATION_STACK_1_0
  ApplicationInsightsMonitoring:
    Type: AWS::ApplicationInsights::Application
    Properties:
      ResourceGroupName:
        Ref: ApplicationResourceGroup
      AutoConfigurationEnabled: 'true'
Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
  HelloWorldApi:
    Description: API Gateway endpoint URL for Prod stage for Hello World function
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: Hello World Lambda Function ARN
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: Implicit IAM Role created for Hello World function
    Value: !GetAtt HelloWorldFunctionRole.Arn

セクション

  • Transform宣言は飛ばして、まず、セクション
    • Globals:AWS SAMに固有の(共通となる)セクションで、すべてのサーバーレス関数とAPI に共通するプロパティを定義する。
      Globalsセクションで定義されているプロパティを継承するリソース
      • AWS::Serverless::Function
      • AWS::Serverless::Api
      • AWS::Serverless::SimpleTable
    • Resources:AWS CloudFormation リソースと AWS SAM リソースの組み合わせを含めることができる。
      • AWS SAMリソース
        • AWS::Serverless::Api
        • AWS::Serverless::Application
        • AWS::Serverless::Connector
        • AWS::Serverless::Function
        • AWS::Serverless::HttpApi
        • AWS::Serverless::LayerVersion
        • AWS::Serverless::SimpleTable
        • AWS::Serverless::StateMachine
      • AWS CloudFormationリソース
        • 多いので、こちら参照とさせてくださいAWS resource and property types reference
          Outputsスタックのプロパティを確認すると返される値。AWS CloudFormation テンプレートの Outputs セクションに直接対応する。テンプレートファイルを分けた時に、別ファイルのリソースIDなどを参照するために使われるようです。テンプレートファイル1つであれば不要ってことですね。
Outputs:
  Logical ID: # 論理ID ex)HelloWorldFunction
    Description: Information about the value # 出力値の説明 ex)Hello World Lambda Function ARN
    Value: Value to return # 出力値(リテラル、パラメタ参照、擬似パラメタ、マッピング値、組み込み関数を含めることができる) ex)HelloWorldFunction.Arn
    Export: # クリススタック参照にエクスポートされるリソースの名前
      Name: Name of resource to export

Globalsセクション

  • リソースとプロパティ
    • Function
      • Timeout: 3:タイムアウト時間
      • MemorySize: 128:使用するメモリサイズ
      • Tracing: Active:X-Rayトレースの有効化/無効化
    • Api

Resourcesセクション

  • リソースとプロパティ
    • HelloWorldFunction(関数名)
      • Type: AWS::Serverless::Function:Lambda関数、IAM実行ロール、及び、この関数をトリガーするイベントソースマッピングを作成
      • Properties::プロパティ
        • CodeUri: hello_world/:関数コードのS3 URI、ローカルフォルダへのパス、またはFunctionCodeオブジェクト ※PackageType プロパティが Zip に設定されている場合のみ適用
        • Handler: app.lambda_handler:実行を開始するために呼び出されるコード内の関数 ※PackageType プロパティが Zip に設定されている場合のみ適用
        • Runtime: python3.9:関数のランタイムの識別子です。 ※PackageType プロパティが Zip に設定されている場合のみ適用
        • Architectures:- x86_64:関数の命令セットアーキテクチャ。 ※デフォルト「x86_64」
        • Events::この関数をトリガーするイベントを指定 ※詳細は、>>
          • HelloWorld:
          • Type: Api:イベントタイプ
          • Properties::このイベントマッピングのプロパティ ※詳細は、>>
            • Path: /hello:この関数が呼び出される URI パス ※/で始まる必要がある
            • Method: get:この関数が呼び出される HTTP メソッド
    • ApplicationResourceGroup
      • Type: AWS::ResourceGroups::Group:指定された名前と説明を使用してリソース グループを作成
      • Properties::プロパティ
        • Name:リソースグループの名前
            + Fn::Sub: ApplicationInsights-SAM-${AWS::StackName}
            組み込み関数 Fn::Sub は、入力文字列の変数を、指定した値に置き換える。スタック名が入ったこの文字列の指定となる
        • ResourceQuery:どのAWSリソースが関連するリソースグループのメンバーであるかを動的に判断するために使用されるリソースクエリ構造
            + Type: CLOUDFORMATION_STACK_1_0:AWS CloudFormation スタックベースのリソース グループを作成するには、"CLOUDFORMATION_STACK_1_0"を指定 ※詳細は、>>
    • ApplicationInsightsMonitoring
      • ApplicationInsightsMonitoring:リソース グループから作成されたアプリケーションを追加する
      • Properties::プロパティ
        • ResourceGroupName:リソースグループの名前
          • Ref: ApplicationResourceGroup:指定したリソース「ApplicationResourceGroup」の値を組み込み関数Refが返す ※Ref関数の詳細は、>>
      • AutoConfigurationEnabled:trueの場合、アプリケーションコンポーネントは、Application Insights によって推奨される監視構成で構成される

まとめ

ひとまず、Hello World Example template.yamlの内容を1つ1つ見てみました。大体は理解できました。最後の方のリソースグループらへんは、理解が足りていないのでまた別の機会に詳細を調べて理解しようと思います。

参考

Discussion