Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Stripeを組み込む際の CDK実装Tips/awsbasic-202202
Search
Hidetaka Okamoto (Stripe)
February 26, 2022
Technology
240
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Stripeを組み込む際の CDK実装Tips/awsbasic-202202
AWS エバンジェリストシリーズ AWSの基礎を学ぼうの登壇資料です。
https://awsbasics.connpass.com/event/235164/
Hidetaka Okamoto (Stripe)
February 26, 2022
More Decks by Hidetaka Okamoto (Stripe)
See All by Hidetaka Okamoto (Stripe)
Stripeではじめる Revenue Operations / jp_stripes_okinawa_8
stripehideokamoto
0
340
収益を高めるための Stripeダッシュボード活用術 / jp_stripes_online_7
stripehideokamoto
0
430
No-code SaaS and Full Site Editing / wcasia2023
stripehideokamoto
0
280
コア機能開発に集中するための Stripe Checkout活用法 / jp_stripes_deep_dive_202301
stripehideokamoto
0
570
State of Checkout 2022から見た オンライン決済フローの最適化/jp-stripes-miyzaki-202301
stripehideokamoto
0
260
サブスクリプション決済入門 Stripeでの実装方法と、要件定義時のポイント/okta-stripe-202301
stripehideokamoto
0
220
ノーコード・ローコードツールで サブスク運用を効率化する方法 / JP_Stripes_Osaka_202301
stripehideokamoto
0
180
ビジネスユーザを巻込む Stripeダッシュボード活用法 / jp_stripes_deepdive-202212
stripehideokamoto
0
370
AWSでローコードにはじめる サブスクリプション運用の効率化/aws-startup-tech-meetup-fukuoka-2
stripehideokamoto
0
200
Other Decks in Technology
See All in Technology
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
350
Amazon S3 Tablesに全部任せてみた結果——コンパクション/スナップショット管理は本当に手放せるか
shigeruoda
0
380
AI活用の現在地、 ちゃんと見えてますか?/XPfest-2026
visional_engineering_and_design
0
150
grill-me(grilling):AI駆動開発を超助けてくれるSkill / grill me
mathbullet
0
100
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
3
230
全員がプロダクトへ向き合う組織を持続成長させるために——組織づくりのフライホイールと4象限 / The Flywheel Model and Four Quadrants for Organizational Design
hiro_torii
3
830
生成AIのテナント制御とシャドーMCP対策 | AIを"止めずに"、情報を守る
yukun
0
110
Bet AI Day 2026丨How We Bet AI: AIとともに働く場をつくる
layerx
PRO
2
2.2k
Hub & Spoke 環境のネットワークルーティングを分解してみる
tsuyataku
1
530
AIエージェントを雇う前に決める5つのこと
knishioka
1
160
Backstageでつくるセルフサービスな社内開発基盤
kikunosuke75
1
290
Azure App Service / Container Apps の組み込み認証
kuniteru
0
190
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
410
Evolving SEO for Evolving Search Engines
ryanjones
0
280
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
AI: The stuff that nobody shows you
jnunemaker
PRO
9
970
Designing for Performance
lara
611
70k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
330
The Curious Case for Waylosing
cassininazir
1
490
Chasing Engaging Ingredients in Design
codingconduct
0
300
Prompt Engineering for Job Search
mfonobong
0
440
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Transcript
Stripeを組み込む際の CDK実装Tips AWS エバンジェリストシリーズ AWSの基礎を学ぼう Hidetaka Okamoto(@hide__dev) 2022/02/26
岡本 秀高 ( @hide__dev ) • Stripe Developer Advocate (ex-developer
in Digitalcube) • JavaScript / TypeScript developer • AWS / Next.js / WordPress / etc… • WordCamp Kyoto 2017 / JP_Stripes Connect 2019 / AWS Samurai 2017 / etc… • 🐈(猫フラご容赦) 2 ジャムジャム!!Jamstack_5 #awsbasics
3 https://jawsug.connpass.com/event/240422/
4 https://stripe.com/jp
サーバーサイドSDKで、簡単に決済系の組み込みが可能 5 AWS エバンジェリストシリーズ AWSの基礎を学ぼう #awsbasics const session = await
stripe.checkout.sessions.create({ mode: "payment", success_url: `${req.headers.origin}`, cancel_url: `${req.headers.origin}`, line_items:[{ price: req.body.price_id, quantity: 1 }] }) return session.url
6 そのコード、どこにどうやってデプロイしよう? AWS エバンジェリストシリーズ AWSの基礎を学ぼう
7 https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html
AWS CDKでServerless Functionを実装 8 AWS エバンジェリストシリーズ AWSの基礎を学ぼう #awsbasics # アプリをセットアップ
% mkdir new-cdk-app % cd new-cdk-app % cdk init –language typescript # ライブラリのインストールやファイルの配置 % npm install stripe % mkdir -p resources/functions/ % touch resources/functions/stripe.js # デプロイ % cdk deploy –watch
料金データを返すLambdaの例 9 AWS エバンジェリストシリーズ AWSの基礎を学ぼう #awsbasics const stripe = require('stripe')(process.env.STRIPE_SECRET_API_KEY);
exports.main = async function(event, context) { try { const { data } = await stripe.prices.list({ lookup_keys: [process.env.STRIPE_PRICE_LOOKUP_KEY] }) return { statusCode: 200, body: JSON.stringify(data) }; } catch(error) { const body = error.stack || JSON.stringify(error, null, 2); return { statusCode: 400, body: JSON.stringify(body) }; } }
LambdaをCDKで定義 10 AWS エバンジェリストシリーズ AWSの基礎を学ぼう #awsbasics import { Stack, StackProps
} from 'aws-cdk-lib'; import { Construct } from "constructs"; import * as lambda from "aws-cdk-lib/aws-lambda"; export class AwsCdkStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const handler = new lambda.Function(this, "StripeHandler", { runtime: lambda.Runtime.NODEJS_14_X, // So we can use async in widget.js code: lambda.Code.fromAsset("resources/functions"), handler: "stripe.main", environment: { STRIPE_PRICE_LOOKUP_KEY: ‘lookup-key’, STRIPE_SECRET_API_KEY: 'sk_xxx' } }); }}
環境変数を何処に置こう? 11 AWS エバンジェリストシリーズ AWSの基礎を学ぼう #awsbasics import { Stack, StackProps
} from 'aws-cdk-lib'; import { Construct } from "constructs"; import * as lambda from "aws-cdk-lib/aws-lambda"; export class AwsCdkStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const handler = new lambda.Function(this, "StripeHandler", { runtime: lambda.Runtime.NODEJS_14_X, // So we can use async in widget.js code: lambda.Code.fromAsset("resources/functions"), handler: "stripe.main", environment: { STRIPE_PRICE_LOOKUP_KEY: ‘lookup-key’, STRIPE_SECRET_API_KEY: 'sk_xxx' } }); } }
12 Secrets Managerの値を読み取る AWS エバンジェリストシリーズ AWSの基礎を学ぼう
Secrets Managerの値を環境変数に渡す例 13 AWS エバンジェリストシリーズ AWSの基礎を学ぼう #awsbasics import * as
sm from "aws-cdk-lib/aws-secretsmanager"; export class AwsCdkStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const secret = sm.Secret.fromSecretAttributes(this, "ImportedSecret", { secretCompleteArn: "登録したSecretのARN" }); const handler = new lambda.Function(this, "StripeHandler", { environment: { STRIPE_PRICE_LOOKUP_KEY: secret.secretValueFromJson('lookup-key').toString(), STRIPE_SECRET_API_KEY: ‘sk_xxx’ } …
14 もっと安全に管理したい AWS エバンジェリストシリーズ AWSの基礎を学ぼう
LambdaにSecrets Managerへのアクセス権限を設定 15 AWS エバンジェリストシリーズ AWSの基礎を学ぼう #awsbasics const handler =
new lambda.Function(this, "StripeHandler", { runtime: lambda.Runtime.NODEJS_14_X, // So we can use async in widget.js code: lambda.Code.fromAsset("resources/functions"), handler: "stripe.main", environment: { STRIPE_PRICE_LOOKUP_KEY: secret.secretValueFromJson('lookup-key').toString(), } }); handler.addToRolePolicy(new iam.PolicyStatement({ resources: [secret.secretArn], actions: ['secretsManager:GetSecretValue'], }))
Secrets Managerの値を取得して、利用する 16 AWS エバンジェリストシリーズ AWSの基礎を学ぼう #awsbasics const AWS =
require('aws-sdk'); const Stripe = require('stripe'); exports.main = async function(event, context) { try { const secretsmanager = new AWS.SecretsManager(); const secrets = await secretsmanager.getSecretValue({ SecretId: 'secret-id' }) const secretsJSON = JSON.parse(secrets.SecretString) const stripe = new Stripe(secretsJSON.STRIPE_SECRET_API_KEY)
まとめ • AWS CDKを利用すると、アプリの実装言語でAWSインフラも定義できる • StripeなどのAPIキーを利用するSaaSを使う場合、 Secrets Manager / Systems
ManagerとCDKを組み合わせて、 テンプレートからキー情報を秘匿できる • テスト環境・本番環境の切り替えまでやりたい場合は、 CDKのContextを活用しよう https://docs.aws.amazon.com/cdk/v2/guide/get_context_var.html 17 AWS エバンジェリストシリーズ AWSの基礎を学ぼう
Thanks! • Twitterハッシュタグでシェア #awsbasics #JP_Stripes • Twitterアカウント: @hide__dev @StripeJapan •
QiitaでStripeに関する 開発ブログ更新中 https://qiita.com/organizations/stripe 18 AWS エバンジェリストシリーズ AWSの基礎を学ぼう