この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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だけでも使ってみてはいかがでしょうか?