GUIからサーバレスアプリのリソースをラクラク構築!! re:inventのEXPOで見かけたStackeryを試してみた #reinvent

2019.12.09

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

CX事業本部@大阪の岩田です。re:invent2019のEXPOで見かけたStackeryについてご紹介します。

Stackeryとは?

2016年に設立されたサーバーレスアプリケーション向けのツールを開発/提供しているベンチャー起業です。Lambda向けにPHPのカスタムランタイムを開発した会社としても知られています。

昨年末にLambdaでEC-CUBEを動かすブログに挑戦した際、カスタムランタイムのバグを見つけてコントリビュートしたこともあってStackeryという名前が記憶に残っており、re:inventのEXPO会場でブースを見かけたので訪問してみました。

ブースでは社名と同様の製品Stackeryについての説明やデモを行っていました。

こちらの製品Stackeryを使うとGUIから簡単にサーバーレスアプリケーションのリソースが定義でき、リアルタイムにSAMテンプレートが作成できます。その他にもデバッグ支援や複数環境へのデプロイ支援といった様々な機能を有しています。公式の動画を見て頂くとイメージが湧きやすいと思います。

About Stackery

やってみる

現地で実際にデモを見せてもらって、とても便利そうだなと感じたので、実際にStackeryを使ってみました。以下に手順をまとめています。

アカウント登録

まずはアカウント登録を行います。

Sign UP画面まで移動し、必要事項を入力します。

ツール類の導入

アカウントが登録できたらStackery CLIをインストールします。

brew tap stackery/tap
brew install stackery-cli

Stackery CLIは内部的にSAM CLIを利用します。未インストールの場合は

  • AWS CLI
  • SAM CLI
  • Docker Desktop

も合わせてインストールしておきましょう。

さらにVS CodeのExtentionも導入しておきす。このブログでは主にVSCodeのプラグインを使って作業を進めていきます。

初期設定

Stackery CLIがインストールできたらstackery loginコマンドを実行し、初期設定を行います。

$stackery login
? Stackery login email address: <登録したメールアドレス>
? Stackery password: ****************

Successfully logged in and created a new API key for this machine.

新しいスタックの作成

初期設定ができたので、ここから実際にサーバーレスアプリケーションを作成していきます。以後の内容はStackery公式のStackery Quickstart NodeJSの内容を一部抜粋して進めていきます。

まずは新しいプロジェクトを作成します。

stackery init -n stackery-quickstart

これでstackery-quickstartというディレクトリ配下にプロジェクトの雛形が作成されます。作成されたstackery-quickstartディレクトリに移動し、VS CodeのExtentionからSAMテンプレートを編集していきましょう。

リソースの追加

VS Codeのプラグインから諸々のAWSリソースを定義していきます。まずはドラッグ&ドロップでAPI GWを追加してみます。追加できたらAPI GWのアイコンをダブルクリックし、以下の設定を追加し、SAVEをクリックします。

  • ROUTESにGET /itemsを追加
  • ROUTESにGET /newItemを追加
  • ENABLE CORSのチェックをON

追加するとリアルタイムにSAMテンプレートが更新されていきます。

続いてAPI GWの各ルートに対してLambdaを紐付けます。先ほどと同様にドラッグ&ドロップでLambdaのリソースを追加し、API GWのルートとLambdaの丸印をドラッグ&ドロップで接続します。接続できたらLambdaのアイコンをダブルクリックし、以下の通り設定を行います。

  • POST /newItemに紐付けたLambda
    • LOGICAL IDにnewItemを設定
    • SOURCE PATHにsrc/newItemを設定
  • GET /itemsに紐付けたLambda
    • LOGICAL IDにgetItemsを設定
    • SOURCE PATHにsrc/getItemsを設定

最後にDynamoDBのテーブルを追加します。先ほどと同様にドラッグ&ドロップでDynamoDBのリソースを追加し、Lambdaの丸印をドラッグ&ドロップして接続します。これでLambda実行ロールにDynamoDBのテーブルへのアクセス権が付与されます。接続できたらDynamoDBのアイコンをダブルクリックし、LOGICAL IDにItemsを設定しておきます。

準備は以上です。本当はLambdaのコードも実装したいところですが、今回はリソース管理用のツールとしての評価が主目的なのでコードの実装は省略します。

デプロイ

ここまで準備できたらデプロイしてみます。

stackery deploy --interactive-setup

と実行することで対話的にデプロイが実行できます。デプロイ先のリージョンを指定したり、stackery用のIAMロールが作成されることを承認したりします。ちなみにstackery用のIAMロール作成を許可すると専用のCFnスタックが作成され、以下のようなリソース群が作成されます。

デプロイを実行すると以下のような出力が表示されます。

================================================================================
Step 1/4 - Linking your AWS account with Stackery
================================================================================
Account already linked, continuing setup

================================================================================
Step 2/4 - Using environment 'blog-demo'
================================================================================

================================================================================
Step 3/4 - Creating stack 'stackery-quickstart'
================================================================================
Stack 'stackery-quickstart' already exists, continuing setup

================================================================================
Step 4/4 - Deploying stack 'stackery-quickstart' using environment 'blog-demo' via local build
================================================================================
Using template at template.yaml

Update Template Phase: Starting...

Update Template Phase: Succeeded

PreBuild Phase: Skipping

ConvertEdgeFunctions Phase: Starting...

ConvertEdgeFunctions Phase: Succeeded


Build Phase: Starting...
Using AWS Profile 'default'
[sam build --template .stackery/template.yaml --region us-east-1 --base-dir . --profile default]
Building Functions...
2019-12-09 00:11:06 Building resource 'getItems'
2019-12-09 00:11:06 Running NodejsNpmBuilder:NpmPack
2019-12-09 00:11:08 Running NodejsNpmBuilder:CopyNpmrc
2019-12-09 00:11:08 Running NodejsNpmBuilder:CopySource
2019-12-09 00:11:08 Running NodejsNpmBuilder:NpmInstall
2019-12-09 00:11:09 Running NodejsNpmBuilder:CleanUpNpmrc
2019-12-09 00:11:09 Building resource 'newItem'
2019-12-09 00:11:09 Running NodejsNpmBuilder:NpmPack
2019-12-09 00:11:09 Running NodejsNpmBuilder:CopyNpmrc
2019-12-09 00:11:09 Running NodejsNpmBuilder:CopySource
2019-12-09 00:11:09 Running NodejsNpmBuilder:NpmInstall
2019-12-09 00:11:10 Running NodejsNpmBuilder:CleanUpNpmrc

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Package: sam package --s3-bucket <yourbucket>


Build Phase: Succeeded


PostBuild Phase: Skipping

PrePackage Phase: Skipping

Package Phase: Starting...
Using AWS Profile 'default'
[sam package --s3-bucket stackery-assetsbucket-xxxxxxxxxxx --s3-prefix deployments/blog-demo/stackery-quickstart/2019-12-08T15:11:03.889Z --output-template-file .aws-sam/build/packaged-template.yaml --profile default]
Uploading to deployments/blog-demo/stackery-quickstart/2019-12-08T15:11:03.889Z/7c9893ad9e3e22886b0205284dfdc6f4  1017 / 1017.0  (100.00%)
Successfully packaged artifacts and wrote output template to file .aws-sam/build/packaged-template.yaml.
Execute the following command to deploy the packaged template
aws cloudformation deploy --template-file /xxxxxxxxxxxx/stackery-quickstart/.aws-sam/build/packaged-template.yaml --stack-name <YOUR STACK NAME>
Uploaded template (.aws-sam/build/packaged-template.yaml) to S3 Bucket (stackery-assetsbucket-xxxxxxxxxxx) Key (deployments/blog-demo/stackery-quickstart/2019-12-08T15:11:03.889Z/e747c482c4c1736efa562b14fe27fb21.template)

Package Phase: Succeeded


RestoreEdgeFunctions Phase: Starting...

RestoreEdgeFunctions Phase: Succeeded


PostPackage Phase: Skipping

PreSubmitChangeset Phase: Skipping

SubmitChangeset Phase: Starting...
Change Set Created:  {
  Id: "arn:aws:cloudformation:us-east-1:123456789012:changeSet/stackery-quickstart-blog-demo-FWEWAN/31da38ed-92ab-4460-9923-b414de50f07e",
  StackId: "arn:aws:cloudformation:us-east-1:123456789012:stack/stackery-quickstart-blog-demo/fcf79c10-19cc-11ea-bc56-1230a5204572"
}

SubmitChangeset Phase: Succeeded


PostSubmitChangeset Phase: Skipping
Executing Changeset Phase: Starting...
Change Set ARN:  arn:aws:cloudformation:us-east-1:123456789012:changeSet/stackery-quickstart-blog-demo-FWEWAN/31da38ed-92ab-4460-9923-b414de50f07e

--> Verifying AWS account information...
	Alias:
	Account ID: 123456789012
	Region:     us-east-1

--> Deploying stack
	Executing CloudFormation change set
	DeploymentMarkerTagFWEWAN                         	CREATE_IN_PROGRESS
	DeploymentMarkerTagFWEWAN                         	CREATE_IN_PROGRESS	Resource creation Initiated
	DeploymentMarkerTagFWEWAN                         	CREATE_COMPLETE
	Items                                             	CREATE_IN_PROGRESS
	Items                                             	CREATE_IN_PROGRESS	Resource creation Initiated
	Items                                             	CREATE_COMPLETE
	newItemRole                                       	CREATE_IN_PROGRESS
	getItemsRole                                      	CREATE_IN_PROGRESS
	newItemRole                                       	CREATE_IN_PROGRESS	Resource creation Initiated
	getItemsRole                                      	CREATE_IN_PROGRESS	Resource creation Initiated
	newItemRole                                       	CREATE_COMPLETE
	getItemsRole                                      	CREATE_COMPLETE
	newItem                                           	CREATE_IN_PROGRESS
	getItems                                          	CREATE_IN_PROGRESS
	getItems                                          	CREATE_IN_PROGRESS	Resource creation Initiated
	newItem                                           	CREATE_IN_PROGRESS	Resource creation Initiated
	getItems                                          	CREATE_COMPLETE
	newItem                                           	CREATE_COMPLETE
	QuickstartApi                                     	CREATE_IN_PROGRESS
	QuickstartApi                                     	CREATE_IN_PROGRESS	Resource creation Initiated
	QuickstartApi                                     	CREATE_COMPLETE
	getItemsQuickstartApiGETitemsPermissionStage      	CREATE_IN_PROGRESS
	QuickstartApiDeployment6610cb8062                 	CREATE_IN_PROGRESS
	getItemsQuickstartApiGETitemsPermissionStage      	CREATE_IN_PROGRESS	Resource creation Initiated
	newItemQuickstartApiPOSTnewItemPermissionStage    	CREATE_IN_PROGRESS
	newItemQuickstartApiPOSTnewItemPermissionStage    	CREATE_IN_PROGRESS	Resource creation Initiated
	QuickstartApiDeployment6610cb8062                 	CREATE_IN_PROGRESS	Resource creation Initiated
	QuickstartApiDeployment6610cb8062                 	CREATE_COMPLETE
	QuickstartApiStage                                	CREATE_IN_PROGRESS
	QuickstartApiStage                                	CREATE_IN_PROGRESS	Resource creation Initiated
	QuickstartApiStage                                	CREATE_COMPLETE
	getItemsQuickstartApiGETitemsPermissionStage      	CREATE_COMPLETE
	newItemQuickstartApiPOSTnewItemPermissionStage    	CREATE_COMPLETE
	stackery-quickstart-blog-demo                     	CREATE_COMPLETE
	Stack Status         		CREATE_COMPLETE

Stack was successfully deployed

Executing Changeset Phase: Succeeded

--> Stack Resource Summary
	Status: deployed
	Finished: 2019-12-08T15:13:11.150Z
	ChangeSet: arn:aws:cloudformation:us-east-1:123456789012:changeSet/stackery-quickstart-blog-demo-FWEWAN/31da38ed-92ab-4460-9923-b414de50f07e
	Region: us-east-1
	AWS stack name: stackery-quickstart-blog-demo

	REST API Endpoints:
	  QuickstartApi:
	    GET https://bsxy4w4dx3.execute-api.us-east-1.amazonaws.com/blog_demo/items
	    POST https://bsxy4w4dx3.execute-api.us-east-1.amazonaws.com/blog_demo/newItem

	Functions:
	  getItems             arn:aws:lambda:us-east-1:123456789012:function:stackery-quickstart-blog-demo-getItems
	  newItem              arn:aws:lambda:us-east-1:123456789012:function:stackery-quickstart-blog-demo-newItem

CFnのマネコンを確認すると、色々生成されていることが分かります。

また、Stackeryのダッシュボードからも諸々確認できるようになっています。

料金プランについて

気になる料金プランと機能ですが、以下の通りです。まずは無料のDevelopperPlanから気軽に試してみてはいかがでしょうか?

Developer Plan

  • 料金
    • 1年間無料
    • 最大3ユーザー
    • 最大6個のアクティブスタック
  • 機能
    • Lambdaのコードをローカルで開発可能
    • VS CodeのExtentionでリソースの可視化&設定が可能
    • CLIでデプロイ可能
    • デプロイのカスタムHookが利用可能
    • 各スタックのデプロイ状況をダッシュボードで集中管理
    • パラメータ/シークレット管理の統合
    • コミュニティのサポート

Professional Plan

  • 料金
    • アクティブなスタック1つにつき月額$10
    • ユーザー数が無制限
  • 機能
    • Developer Planの全機能
    • 事前設定されたCI/CD環境が利用可能
    • クラウドベースのGitホストプロバイダーとの統合
    • Gitのバージョンコントロールから直接最新バージョンをデプロイ可能
    • ダッシュボードからデプロイ可能
    • ダッシュボードベースのビジュアルテンプレートエディタが利用可能
    • Stackery社のサーバーレスエンジニアによるサポート付き

Enterprise Plan

  • 料金
    • 要相談(年額$10,000から)
  • 機能
    • Professional Planの全機能
    • セルフホスティングのGitリポジトリとの統合
    • SSO統合
    • クラウドリソースのカスタマイズと統合
    • Enterpriseサポート
    • 独自トレーニングが利用可能

詳細はこちら

Plans from Proof-of-Concept to Production

まとめ

製品紹介にある

Write Functions, Not YAML

の通り、テンプレート管理の煩雑さを和らげてくれる良いツールだと感じました。今回紹介した内容は最低限のチュートリアルですが、他にも色々な機能を備えているようなので、もう少し深掘りして触っていきたいと思います。皆さんもまずはVS CodeのExtentionだけでも使ってみてはいかがでしょうか?