[検証] Serverless Application Repository を使って、AWS SAMで品質の高いテンプレートを管理する! #reinvent

AWS re:Invent2018のKeynote2日目でAWS Serverless Application Model Supports Nested Applications Using the AWS Serverless Application Repositoryが発表されました。

このアップデートで、SAMのテンプレートからServerless Application Repositoryに登録されているアプリケーションテンプレートをライブラリのように利用することが出来るようになり、よりコンパクトに品質の高いテンプレート管理ができそうです。

さっそくためしてみたので、ブログ投下していきます!

概要はこちらの速報記事にまとまっています。

【速報】Nested ApplicationsがServerless Application Repositoryで利用できるようになりました

ためしてみた

こちらを参考に進めていきます。

まず前提として、AWS SAMテンプレートからアプリケーションテンプレートをネストするには、次の要素を取得する必要があります。

  • Serverless Application Repositoryで公開されているARN
  • セマンティックバージョン
  • パラメータ

AWS管理コンソールにログインし、AWS Serverless Application Repositoryからネストするアプリケーションを検索

今回は、ホームに掲載されていた注目のアプリケーションの中から、お問い合わせフォームを選択しました。

アプリケーションの詳細ページURLから、ARN情報を取得

※ ~ となっていますが、実際は / です。

AWS CLIを使用して、アプリケーションのパラメータとセマンティックバージョン情報を取得

aws serverlessrepo get-applicationコマンドを使用して、セマンティックバージョンを取得します。

aws serverlessrepo get-application --application-id arn:aws:serverlessrepo:us-east-1:132093761664:applications/Contact-Us

アプリケーションをネストした、AWS SAMテンプレートを作成

これで、

  • Serverless Application Repositoryで公開されているARN
  • セマンティックバージョン
  • パラメータ ← これは、リポジトリのReadme等を見ればわかります。

が揃ったので、次のようにアプリケーションをネストしてAWS SAMテンプレートを作成していきます。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources: 
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./
      Handler: app.lambda_handler
      Runtime: python3.6
      Events:
        HelloWorldFunction:
          Type: Api
          Properties:
            Path: /hello
            Method: get
  AddedApp:
    Type: AWS::Serverless::Application
    Properties:
      Location:
        ApplicationId: arn:aws:serverlessrepo:us-east-1:132093761664:applications/Contact-Us # 公開されているARN
        SemanticVersion: 1.1.0 # セマンティックバージョン
      Parameters: # 以下パラメータ
        Subject: "Contact Us"
        ReCaptchaSecret: "value" 
        ToEmailAddress: "arai@example.com"

※ ちなみに、プロジェクトのホームディレクトリに、app.pyというファイル名でLambdaハンドラーは作成済み。

SAM のデプロイを実行

$ aws s3 mb s3://sam-repo-tmp-bucket
$ aws cloudformation package --template-file sam-template.yml --output-template-file output.yaml --s3-bucket sam-repo-tmp-bucket
$ aws cloudformation deploy --template-file output.yaml --stack-name sam-repo-tmp-stack --capabilities  CAPABILITY_IAM CAPABILITY_AUTO_EXPAND
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - sam-repo-tmp-stack

デプロイされている結果を確認

CloudFormationでスタックの作成に成功しているのがわかります。

まとめ

いかがだったでしょうか。

サーバレスアーキテクチャが成長するにつれ複雑になるテンプレートに対して、 Serverless Application Repositoryを使って共通部分をうまく分離することで、管理がとても楽になりそうです。

また、複数のアプリケーションテンプレートで共通部分がバージョンごとに管理&再利用できるのも大きなメリットだと思います。

一点、ネストしたテンプレート内部にLambdaを追加したい場合はどう記述するのだろう?と疑問に思いましたが、ここらへんはドキュメントなど揃ってから検証していきたいと思います。

以上、現地からの検証記事でした。