APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

SAM + Application Composer で爆速サーバレス開発 🚀

はじめに

こんにちは、クラウド事業部のおほりです。
皆さんは

マウスポチポチだけでIaC出来たら良いのにな...

と思ったことはありませんか?私もそう思います。 一応 CloudFormation Designer という GUI ツールはあるのですが、いまいちイケてないです(サービスアイコンもちょっと古いですね...)

CloudFormation Designerの画面

しかし最近になって Application Composer なるツールが GA になりました。

aws.amazon.com

こちらのツールと SAM CLI を組み合わせれば、ゼロから爆速でサーバレスアプリケーションを立ち上げることが出来ます

やってみよう

SAM で init する

sam init コマンドで適当なひな形"hello-world-example"を生成します。

$ sam init

You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.

Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1

Choose an AWS Quick Start application template
        1 - Hello World Example
        2 - Multi-step workflow
        3 - Serverless API

...(省略)...

    -----------------------
    Generating application:
    -----------------------
    Name: sam-app
    Runtime: python3.9
    Architectures: x86_64
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .
    Configuration file: sam-app/samconfig.toml

sam-app/ディレクトリが生成されテンプレートやSAMの設定ファイル、Lambda関数用のコードなどが格納されました。

$ ls -la sam-app/
total 48
drwxr-xr-x 6 vscode vscode 4096 Mar 20 03:04 .
drwxr-xr-x 4 vscode vscode 4096 Mar 20 03:00 ..
drwxr-xr-x 2 vscode vscode 4096 Mar 20 03:00 events
-rw-r--r-- 1 vscode vscode 3730 Mar 20 03:00 .gitignore
drwxr-xr-x 2 vscode vscode 4096 Mar 20 03:00 hello_world
-rw-r--r-- 1 vscode vscode    0 Mar 20 03:00 __init__.py
-rw-r--r-- 1 vscode vscode 8349 Mar 20 03:00 README.md
-rw-r--r-- 1 vscode vscode  836 Mar 20 03:00 samconfig.toml
-rw-r--r-- 1 vscode vscode 1570 Mar 20 03:02 template.yaml
-rw-r--r-- 1 vscode vscode    0 Mar 20 03:04 template.yaml:Zone.Identifier
drwxr-xr-x 4 vscode vscode 4096 Mar 20 03:00 tests

資材を Application Composer で開く

Application Composer はローカルのファイルの読み書きができます(接続モード) 先ほど生成した sam-app/ ディレクトリを選択して読み込ませます。

接続モードの設定
SAMテンプレートの内容が可視化されました! 未対応リソースについては「読み取り専用リソース」と表示され、編集はできないようです。
canvas画面

Application Composer で編集する

おもむろにDynamoDBテーブルを追加して、Lambdaと線でつなげてみます。

DynamoDBテーブルを追加
さらにパーティションキーを変更します。基本的なプロパティは右のメニューから変更できるようです。
パーティションキーを変更
ローカルにあるテンプレートを見てみると、きちんとDynamoDBテーブルが追加されています。
拡張性を考慮してか、リソースタイプは AWS::Serverless::SimpleTable ではなく AWS::DynamoDB::Table になるようです。

...
  Table:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: hello
          AttributeType: S
      BillingMode: PAY_PER_REQUEST
      KeySchema:
        - AttributeName: hello
          KeyType: HASH
      StreamSpecification:
        StreamViewType: NEW_AND_OLD_IMAGES
...

Lambda関数の定義を見ると、ポリシーテンプレート DynamoDBCrudPolicy (Read/Writeを許可する)が設定されていました。IAMロールを書かなくても、DynamoDBテーブルにアクセスできるようSAMがよしなに生成してくれます。 さらに、DynamoDBテーブルの情報(テーブル名とARN)が環境変数として設定されていました!権限回りの設定だけでなく、アクセス時に必要な情報を揃えておいてくれるなんて、至れり尽くせりですね。

...
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
      Environment:
        Variables:
          TABLE_NAME: !Ref Table
          TABLE_ARN: !GetAtt Table.Arn
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref Table
...

ビルドしてみる

最後に sam build コマンドで資材をビルドしてみます。

$ sam build --use-container
Starting Build use cache
Starting Build inside a container
Cache is invalid, running build and copying resources for following functions (HelloWorldFunction)
Building codeuri: /workspaces/work/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction

Fetching public.ecr.aws/sam/build-python3.9:latest-x86_64 Docker container image.......................................................................................................................................................................................................................................................................................................................................................................
Mounting /workspaces/work/sam-app/hello_world as /tmp/samcli/source:ro,delegated inside runtime container
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource

Build Succeeded

テンプレートに異常はなく、無事ビルド成功しました。このままsam deployを実行すればAWS上にデプロイされます。

まとめ

SAM CLI と Application Composer を組み合わせることでコードを書かずにSAMテンプレートを作成・カスタマイズすることができました!
今回のような簡単な構成であれば、ものの5分で立ち上げることができます。 Application Composer はまだ未対応リソースが多いですが、今後の拡充を期待しています。(StepFunctionsのように)

おわりに

私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。

https://www.ap-com.co.jp/service/utilize-aws/

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp

本記事の投稿者: おほり
AWSをメインにインフラ系のご支援を担当しています。 https://www.credly.com/users/ohori44/badges