😺

Terraform で Stripe の料金プランを安全に更新する方法

に公開

Stripe を使ったサブスクリプションサービスを運営していると、事業の成長に伴って料金プランの改定が必要になることがあります。このような変更をマニュアルで行うと、ミスやデータの不整合が生じるリスクがあります。Terraform を使用して Stripe のリソースを Infrastructure as Code (IaC) で管理することで、これらの問題を解決することができます。この記事では、Terraform で Stripe の料金プランを安全に更新する方法について解説します。

Terrafrom Stripe Provider

Terrafrom Stripe ProviderはOSSとして提供されている3rd partyプロバイダーの1つです。kubell(旧Chatwork)などでも利用されているツールで、Stripeのデータをコードにて管理することができます。

Terraform で Stripe を管理するメリット

Stripe のリソースを Terraform で管理することには、以下のようなメリットがあります:

  1. 変更履歴の追跡: Git などのバージョン管理システムと組み合わせることで、料金プランの変更履歴を明確に追跡できます
  2. 環境間の一貫性: 開発環境、テスト環境、本番環境で同じ構成を簡単に維持できます
  3. レビュープロセスの導入: プルリクエストを通じて、料金改定などの重要な変更を複数人でレビューできます
  4. 自動化による人的ミスの防止: 手動操作に比べて、タイプミスなどのヒューマンエラーを減らせます
  5. リソース間の依存関係の管理: 製品と価格設定、機能の関係を明示的に定義できます
  6. 大規模な変更の容易さ: 複数の製品や料金プランを一度に更新する場合も、一貫性を保ちながら実行できます

料金プランの更新で発生しがちな問題

Stripe の料金プランを Terraform で更新しようとすると、次のエラーに遭遇することがあります:

Error: {"status":400,"message":"A price (`price_1R8zzHQ4DONVCgd6CqzEVlrW`) already uses that lookup key.","param":"lookup_key","request_id":"req_BTeD9L5nXufC7F","request_log_url":"https://dashboard.stripe.com/test/logs/req_BTeD9L5nXufC7F?t=1743495401","type":"invalid_request_error"}

これは Stripe の仕様によるもので、2つの理由が組み合わさって発生します。

  • 料金の変更は、Priceリソースを新しく作ることでしか対応できない(すでにその料金で契約しているユーザーを混乱させないため)
  • Priceリソースのlookup_keyは、Priceを削除するだけでは解除されない

Terraformを使って料金の金額を変更する場合、内部的にはPriceリソースを削除して新しく作り直しています。そのため、上記の2つの仕様による影響で、lookup_keyの衝突によるエラーが発生します。

安全な料金プラン更新方法

この問題を解決するには、transfer_lookup_key パラメータを利用します。以下が実例です:

resource "stripe_price" "price_business_monthly" {
    product = stripe_product.product_business.id
    unit_amount = 2500  // 1500円から2500円への値上げ
    currency = "jpy"
    lookup_key = "business_monthly"
    transfer_lookup_key = true  // ここがポイント
    recurring {
        interval = "month"
        interval_count = 1
    }
}

transfer_lookup_key = true を設定すると、Terraform は新しい料金プランを作成する際に、古いリソースから新しいリソースへと lookup_key を移行してくれます。これにより、古いリソースは無効化され、新しいリソースが同じ lookup_key を使用できるようになります。

実行結果

上記の設定で terraform apply を実行すると、以下のように料金プランが安全に更新されます:

stripe_price.price_business_monthly: Destroying... [id=price_1R903JQ4DONVCgd653jWkLi3]
stripe_price.price_business_monthly: Destruction complete after 0s
stripe_price.price_business_monthly: Creating...
stripe_price.price_business_monthly: Creation complete after 1s [id=price_1R903eQ4DONVCgd6pByK29a6]
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

まとめ

Terraform を使って Stripe の料金プランを管理することで、変更の追跡、バージョン管理、レビュープロセス、環境間の一貫性など、多くのメリットが得られます。料金プランを更新する際には transfer_lookup_key = true を設定することで、スムーズに料金改定を実施することができます。

サブスクリプションビジネスの成長に伴って料金体系を見直す際には、この方法を活用してインフラストラクチャとしてのコード管理のメリットを最大限に享受しましょう。

デジタルキューブ

Discussion