GUIからサーバレスアプリのリソースをラクラク構築!! re:inventのEXPOで見かけたStackeryを試してみた #reinvent
CX事業本部@大阪の岩田です。re:invent2019のEXPOで見かけたStackeryについてご紹介します。
Stackeryとは?
2016年に設立されたサーバーレスアプリケーション向けのツールを開発/提供しているベンチャー起業です。Lambda向けにPHPのカスタムランタイムを開発した会社としても知られています。
昨年末にLambdaでEC-CUBEを動かすブログに挑戦した際、カスタムランタイムのバグを見つけてコントリビュートしたこともあってStackeryという名前が記憶に残っており、re:inventのEXPO会場でブースを見かけたので訪問してみました。
ブースでは社名と同様の製品Stackeryについての説明やデモを行っていました。
こちらの製品Stackeryを使うとGUIから簡単にサーバーレスアプリケーションのリソースが定義でき、リアルタイムにSAMテンプレートが作成できます。その他にもデバッグ支援や複数環境へのデプロイ支援といった様々な機能を有しています。公式の動画を見て頂くとイメージが湧きやすいと思います。
やってみる
現地で実際にデモを見せてもらって、とても便利そうだなと感じたので、実際に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
を設定
- LOGICAL IDに
- GET /itemsに紐付けたLambda
- LOGICAL IDに
getItems
を設定 - SOURCE PATHに
src/getItems
を設定
- LOGICAL IDに
最後に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だけでも使ってみてはいかがでしょうか?