こんにちは。ギークフィード araoです。
ギークフィードでは様々な自社開発ソリューションを提供していますが、
その中から、YouWireをAWS MarketplaceにSaaS製品として出品しました。
その際に、AWSが提供しているsbt-awsを利用することで、AWS MarketplaceにSaaS製品としてに必要なAPI処理を対応できたのでご紹介します。
目次
YouWireとは
本題に入る前に、AWS Marketplaceに出品したYouWireをご紹介します。
YouWireは、ビジネスに必要な音声を一元管理するソリューションです。
携帯電話・オフィス電話・Webミーティングなどの音声(通話録音)をYouWireで管理することができ、
音声認識による通話内容のテキスト化や生成AIを利用した要約などを提供しています。
この度、YouWireはAmazon Bedrockと連携し、お客様の業務効率化を実現したことで、
2024 AWS Partner Awardsで Design Partner of the Year – APJを受賞しました!!
詳細は弊社のニュースをぜひぜひぜひご覧ください。
sbt-awsとは
さて、本題です。
sbt-awsはAWSがオープンソースとして公開するソリューションをSaaS化するツールキットです。
Node.jsのライブラリとして利用することができ、SaaSとして必要なControl PlaneとApplication PlaneのAWSリソースをCDKで作成できます。
引用元: https://github.com/awslabs/sbt-aws
また、ソリューションのSaaS化だけでなく、AWS Marketplaceの出品に必要なAPIのAWSリソースを作成することが可能です。
今回はAWS Marketplaceに出品するためにsbt-awsをどのように利用するのか説明します。
AWS MarketplaceにSaas出品するために必要なこと
本記事では触れませんが、以下が必要です。
- AWSと直接契約しているAWSアカウント
- AWSの販売者としての規定を満たすこと
sbt-awsを利用してAWS Marketplaceと連携するControl Planeを構築
それでは、実際にsbt-awsを利用してAWS Marketplaceと連携するControl Planeを構築します。
AWS Marketplace Management Portalでの事前準備
Control Planeを構築する前に、AWS Marketplace Management PortalでSaaSのプロダクト登録を行います。
プロダクト登録する中でfulfillment URLの設定項目があります。
fulfillment URLはAWS Marketplaceでサブスクライブした後にリダイレクトされるSaaSプロダクトのアカウント登録画面(以下、Registration Page)のことを指します。
事前準備の段階では、適当なURL(https://www.geekfeed.co.jp/など)を登録します。
後述するcdkを適用するとサンプルのRegistration PageのURLが発行できるので差し替えます。
プロダクト登録できると、以下の情報が発行されます。
この情報をcdkに設定します。
- Product code
- Metering Service SNS topic ARN
- Entitlement Service SNS topic ARN
AWS Marketplace Management Portalでプロダクト登録する際に、購入テストできるAWSアカウントを設定できます。
購入テストするAWSアカウントを設定することを忘れないようにしましょう。
cdkコードの範囲
今回は以下を作成するcdkのコードを記載します。
- Control Planeに必要なAWSリソース(AWS Marketplaceに出品するための記述もあり)
- AWS Marketplaceでサブスクライブした後のRegistration Pageのサンプルページ
SaaSにはControl PlaneとApplication Planeが必要と記載しましたが、
Application Planeの対応はプロダクトによって異なるので本記事では扱いません。
基本はsbt-awsのREADMEの通りに行います。
cdkのプロジェクトを初期化&sbt-awsをインストール
今回はblog-marketplaceディレクトリで作業します。
cdkのプロジェクトを初期化して、sbt-awsをインストールします。
1 2 3 4 |
mkdir blog-marketplace cd blog-marketplace cdk init app --language typescript npm install @cdklabs/sbt-aws |
/lib/control-plane.tsを作成
プロジェクト(今回はblog-marketplaceディレクトリ)配下にある/libにcontrol-plane.tsを作成します。
control-plane.tsの中身は以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import * as sbt from '@cdklabs/sbt-aws'; import { Stack } from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class ControlPlaneStack extends Stack { public readonly regApiGatewayUrl: string; public readonly eventManager: sbt.IEventManager; constructor(scope: Construct, id: string, props?: any) { super(scope, id, props); const cognitoAuth = new sbt.CognitoAuth(this, 'CognitoAuth', { setAPIGWScopes: false, }); const controlPlane = new sbt.ControlPlane(this, 'ControlPlane', { auth: cognitoAuth, systemAdminEmail: 'dummy@geekfeed.co.jp', }); const myProduct = new sbt.AWSMarketplaceSaaSProduct(this, 'myProduct', { marketplaceTechAdminEmail: 'dummy@geekfeed.co.jp', productCode: 'プロダクトコード', entitlementSNSTopic: 'Entitlement Service SNS topicのARN', // Entitlement Service SNS topic ARN subscriptionSNSTopic: 'Metering Service SNS topicのARN', // Metering Service SNS topic ARN pricingModel: sbt.AWSMarketplaceSaaSPricingModel.CONTRACTS, // CONTRACTS or SUBSCRIPTIONS or CONTRACTS_WITH_SUBSCRIPTION eventManager: controlPlane.eventManager, requiredFieldsForRegistration: ['name'], marketplaceSellerEmail: 'dummy@geekfeed.co.jp' }); new sbt.SampleRegistrationWebPage(this, 'S3BucketProductRegistrationWebPage', { registrationAPI: myProduct.registerCustomerAPI, userProvidedRequiredFieldsForRegistration: ['contactEmail','name'], // Registration Pageに表示する登録項目 imageLogoUrl: 'ソリューションのロゴ画像のURL', // テストのときはこのプロパティを削除してもOK }); this.eventManager = controlPlane.eventManager; this.regApiGatewayUrl = controlPlane.controlPlaneAPIGatewayUrl; } } |
設定する項目において自分が使う際に説明がほしいと思った項目を以下にまとめました。
設定項目名 | 概要 |
---|---|
systemAdminEmail | sbt-awsの管理画面にログインパスワードが通知されるメールアドレス |
marketplaceTechAdminEmail | AWSから対応が必要な通知先のメールアドレス |
productCode | AWS Marketplace Management Portalで発行されるプロダクトコード |
entitlementSNSTopic | AWS Marketplace Management Portalで発行されるEntitlement Service SNS topicのARN |
subscriptionSNSTopic | AWS Marketplace Management Portalで発行されるMetering Service SNS topicのARN |
pricingModel | SUBSCRIPTIONS、CONTRACTS、CONTRACTS_WITH_SUBSCRIPTIONから選ぶ それぞれ、従量課金、契約ベース、契約ベース+従量課金の意味 |
marketplaceSellerEmail | Welcome Emailの送信元メールアドレス Welcome Emailはfulfillment URLで設定するRegistration Pageでアカウント登録者に送信するメールのこと |
/bin/blog-marketplace.tsを修正
cdk initするとプロジェクト(今回はblog-marketplaceディレクトリ)配下に自動的に作成されている/bin/blog-marketplace.tsを以下の内容に修正します。
AWS MarketplaceのAPIがバージニアリージョンのみ対応しているため、リージョンをus-east-1に指定します。
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; import { ControlPlaneStack } from '../lib/control-plane'; // import { AppPlaneStack } from '../lib/app-plane'; const app = new cdk.App(); const controlPlaneStack = new ControlPlaneStack(app, 'ControlPlaneStack-Prod', { env: { region: 'us-east-1' }, }); |
cdkをデプロイ
cdkをデプロイします。
AWSの認証情報が必要なので、profileを設定するなり、環境変数を設定するなりしてから実行してください。
1 2 3 |
npm run build cdk bootstrap cdk deploy ControlPlaneStack |
fulfillment URLを修正
cdkのデプロイが成功すると様々なAWSリソースが作成されます。
CloudFrontのディストリビューションも作成されるため、https://CloudFrontのドメイン/redirectmarketplacetoken をfulfillment URLに設定します。
テストのためにCloudFrontのドメインをfulfillment URLに設定していますが、
実際はCNAMEレコードをDNSサーバに登録することになると思います。
実際にプロダクトをテスト購入
あとは、実際にAWS Marketplaceから該当のプロダクトを購入できるか試してみます。
購入テストを許可しているAWSアカウントから該当のプロダクトをAWS Marketplaceで検索し、購入を進めます。
購入すると以下の画面が表示されるので、クリックしましょう。
無事にRegistration Pageが表示されたら、AWS Marketplaceに出品するためのControl Planeの構築が完了しました。
あとは、Application Planeに対応するようにサービスのコードを修正すればSaaSとしてAWS Marketplaceに出品できます。
まとめ
AWS Marketplaceへ出品したいけど、どうやればいいのか情報が少なくて困っているという方に届けと思いながら書きました。
sbt-awsを利用すれば、AWS MarketplaceとのAPI連携をするControl Planeを作ってくれるので、だいぶ楽になると思います。
- sbt-awsを利用してAWS MarketplaceにSaaSを出品する - 2024-12-11
- Macで利用しているお気に入りアプリ8選 - 2024-12-05
- 毎日触って分かったMake(iPaaS)の良いところ・もう少しなところ - 2024-12-02