Stripe: 【3Dセキュア2.0対応】Stripe.jsのconfirmCardPayment()の内部動作を調べました

背景

  • 2025/4/1より3Dセキュアが義務化されました
  • Stripeが3DS対応を全てを吸収してくれる訳ではなく、一部、加盟店側で実装の修正が必要
    • 加盟店
      • アクワイアラー(中間業者=Stripe)を通じて、カードブランド(VISA、Mastercardなど)の決済ネットワークに加盟し、カード決済サービスを受ける事業者(サービス提供者)
  • 実装の際、Stripe.jsconfirmCardPayment() の内部動作を調べたのでメモ
    • 内部動作を調べた事で3DSの理解が深まりました!

ドキュメント、参考ブログ

結論

  • Stripe.js を通じて、Stripeがカード発行会社(イシュアー)のサーバと連携して認証をおこなっている

前提①: 3Dセキュア (英語: 3-D Secure) とは?

  • ネットでクレジットカード決済するときの本人認証
    • 3つのドメインで連携して本人認証を行う仕組み
  • 要するに...

    • クレジットカードに記載されている情報(カード番号、氏名、署名コード)だけで決済できてしまうと、カードを見られてしまったら不正利用されてしまうので、「クレジットカードに記載されていない情報(=TOTPなど)」での本人確認も行う事で、不正利用をブロックする、という仕組み
    • 典型例
      • ネットでクレジットカードで決済したときに、スマホに認証コードが飛んでくる
  • 3つのドメイン

    • アクワイアラー ※加盟店支援者=カードブランドからライセンスを取得し、加盟店の開拓、審査、管理をする機関
      • 決済代行サービス会社
        • Stripe、など
    • カード発行会社 (イシュアー)
    • カードブランド (スキーム)
      • VISA、Mastercard、JCB、など
  • 流れ

    • 利用確認
      • Stripe(アクワイアラー) → カードブランド(スキーム) → カード発行会社(イシュアー) → 購入者
        • カード発行会社 が 購入者 に本人確認画面を表示する
    • 認証
      • 購入者 → カード発行会社(イシュアー) → カードブランド(スキーム) → Stripe(アクワイアラー)
        • 「利用確認」と逆の順序で認証結果が伝搬される
  • 3DS 1.0 vs 3DS 2.0

    • 1.0 ※旧方式
      • 予め登録したパスワードで、決済の度に毎回必ず認証
    • 2.0
      • TOTP等に対応、リスクベースで認証
        • リスクが低い場合は認証がスキップされる

前提②: Stripe.jsのconfirmCardPayment()を利用して3DS認証画面を表示する方法

  1. 決済時に3DS認証が発生すると、payment_intent.statusrequires_action になる
    • この際、Stirpeのeventとしては payment_intent.requires_action eventが発生する (※1)
    • payment_intent.client_secret でクライアントシークレットが返される
  2. 1. のクライアントシークレットを、Stripe.jsのconfirmCardPayment() の第一引数に渡す
    • これだけで Stire.jp が iframe 内に「3DS認証用のモーダル」を表示してくれる
    • 購入者は↑のモーダルに3DS認証に必要なTOTPなどを入力し認証する
  3. confirmCardPayment() から Promise で 3DS認証後の paymentIntent が返される
    • paymentIntent.status等を参照すれば、3DS認証に成功したがどうかを識別できる

※1 payment_intent.requires_action イベントのイベントデータ

{
  "object": {
    "id": "pi_***",
    "object": "payment_intent",
    //...
    "client_secret": "pi_***_secret_***",
    //...
    "status": "requires_action",
    //...
  }
}

実装イメージ

import { loadStripe } from '@stripe/stripe-js'

// ...

// 3Dセキュア認証が必要な場合
if (currentPaymentIntent?.status === 'requires_action') {
  const clientSecret = currentPaymentIntent.client_secret
  const stripeApiPublicKey = process.env.NEXT_PUBLIC_STRIPE_API_PUBLIC_KEY

  const stripe = await loadStripe(stripeApiPublicKey)

  // モーダルで3DS認証画面を表示
  const { error: stripeError, paymentIntent } = await stripe.confirmCardPayment(clientSecret)

  // 3DS認証が成功した場合
  if (paymentIntent?.status === 'succeeded') {
    //...
  } else {
    // 3DS認証に失敗した場合
    //...
  }

Stripe.jsのconfirmCardPayment()の内部動作の調査方法

Stripe.jsによる3DS認証関連のリクエスト内容

  1. POST https://api.stripe.com/v1/payment_intents/:id/confirm

    • レスポンスで status=requires_actionnext_action.type = use_stripe_sdk と返っているので、Stripe SDK での 3DS認証が必要であると判定される
    • next_action.use_stripe_sdk.directory_server_name=visa となっているので、カードブランド (スキーム) が VISA である事をがわかる
  2. POST https://api.stripe.com/v1/3ds2/authenticate

    • レスポンスで acsURL=https://testmode-acs.stripe.com/3d_secure_2_test/acct_***/threeds2_***/challenge 返っているので、StripeがイシュアーACSサーバーと連携する事が読み取れる
    • ※本番環境ではこのURLがイシュアー(=カード発行会社)のドメインになるハズ
  3. Stripe.jsiframe 内に acsURL を読み込み事で、ifreme内に「3DS認証用の画面」を表示

    • この画面で、ユーザーが TOTP などを入力し、認証を通す
    • iframe 内に acsURL が読み込みこまれている様子
      • Stripe.jsがiframe内にacsURLを読み込んでいる様子
  4. POST https://api.stripe.com/v1/3ds2/challenge_complete

    • このリクエストで、イシュアーの認証結果(=この場合は認証OK)を、Stripeのサーバー側に送信 (してるんだと思う)
  5. GET https://api.stripe.com/v1/payment_intents/:id?is_stripe_sdk=false&client_secret=:シークレット

    • 3DS認証完了後のStripe PaymentIntens オブジェクトを取得
      • これが Stripe.jsconfirmCardPayment()Promise として返される

読書メモ: うまくてダメな写真とヘタだけどいい写真

うまくてダメな写真とヘタだけどいい写真 (amazon)

所感

  • 写真の話としてより、アーティストとして自分を揺さぶられる内容が多かった
    • 本質は写真も音楽も一緒ですね

MEMO

  • ヘタだけど良いもの、を目指したほうが圧倒的によい
    • うまい写真 ≠ いい写真
  • 感動していないならシャッターを押す意味がない
    • 普段目にする景色がつまらなく見えるのは、自分がつまらないから
  • 写真以外から写真を学ぶ
    • 写真がうまくなる前に「いい写真とはなにか?」を考える
      • 写真を映画など(=写真以外)から学んだほうがよい
    • 露出、構図 -> 勉強すればわかるし、大変な勉強でもない -> うまくなった気になるだけ
  • 家族写真
    • 子どもの楽しさを邪魔しない
      • 写真をとるときは絶対に声をかけない
  • AIで生成できるものを作っている人は淘汰される
    • 逆にAIで作れないものを作れれば価値が上がる
    • AIにできることはAIに任せて別の道を進むこと
  • 同じ話を何度もする人は経験が乏しい
    • 打ち上げで写真以外の話をすること
    • 面白い話 = 相手が知らない話
    • つまらない話 = すでに知っている話
  • 趣味の話は道具の話になりがち
    • 道具を使って「どんな経験をしたか」を会話するように心がけましょう
    • 道具の話は補足程度
  • カメラをやるんじゃなくて写真をやる
    • カメラなんかなんでもよい
  • 言葉で伝える
    • 「写真を見た人が自由に感じてほしい」だと見る人は困る
    • 良い作品 = 感情が伝わる作品
      • 説明文がないと感情を伝えることができない
  • 言葉
    • 感情をわかりやすく説明
      • ポエムではなく、小学生でも理解できる言葉で
      • 写真に写っているものの説明ではない
    • OK: 家族で行った遊園地。小学生になった息子はお父さんの前をいくようになった
    • NG: 子どもとブランコ
  • 「自分の好き」を積み重ねる
    • 自分の好きがわからない人は、みんなが好きなもの(=バズる、バエる、エモい)をマネる
  • マグレを分析する
    • 300枚とればマグレあたりが1枚はある
    • その写真をよく見る
      • 太陽がどこにあったか思い出す
    • そうしたらもう一度、同じ条件で撮る。マグレだった写真をもう一度狙う

読書メモ: コード×AIーソフトウェア開発者のための生成AI実践入門

コード×AIーソフトウェア開発者のための生成AI実践入門(amazon)

所感

  • TODO

1 章

  • AIの仕組みを理解する事がAI活用の第一歩

  • プロンプトエンジニアリング

    • AIとの対話を最適化するためのテクニック
    • 安定性、精度の追求
    • ※テクニックは銀の弾丸ではない、AIへの理解がより重要
  • Prompt Engineering Guide

    • 10分目を通せば、一通りのテクニックを把握できる
  • AIによりエンジニアがいらなくなるのでは?

    • NO。むしろ役割は拡大
      • 例: クラウド -> インフラエンジニアは不要にならず、役割が拡大
  • ハルシネーション

    • 生成AIが事実と異なる内容をもっともらしく出力すること
      • AIの使用者のレビューが不可欠
  • トークン

    • AIモデルが処理する最小単位
      • 英語:1単語、日本語:1文字
    • 言語モデルには、一度に処理できるトークン数の上限がある
      • 適切なトークン数での情報提供がAIとのコミュニケーションの鍵
    • 目安: 1,000-2,000 トーク
      • AIに渡すべきファイル数は数ファイル程度
    • AIに過剰な情報を与えることは良い結果をもたらさない
      • AIにとってノイズ
        • ハルシネーションのリスク増大
        • 推論精度の低下
        • 処理時間が長くなる
  • コードレビュー

    • AI活用にあたり、人間が可能なレビュー数の限界 の考慮が必要
      • 自分の限界を理解し、適切な量のレビューを行う事が鍵
    • 1時間あたり、500 行以内
      • 適量を、ゆっくと、限られた時間内で行うと効果的
  • AIとの会話を通じて早く答えにたどり着く

    • 3 回程度の迅速な試行で見極める
      • なんども試行を繰り返す事は時間の無駄
  • 開発支援AIツールの特性と限界を理解し、状況に応じて使い分ける

  • 開発支援AIのタイプ

    1. 自動補完型
      • GitHub Copilot
    2. 対話型
      • ChatGPT
    3. エージェント型
      • GitHub Copilot Workspace
  • 今後

    • 「みんなができないこと」をAIで実現する事が重要
      • みんなが使ってるAIツールを導入する事は差別化にはならない
    • how
      • AIが使うためのデータを用意し、企業として育てる
  • 「コストカット」や「生産性向上」に目を奪われて、「価値創造」の機会を見逃さない

    • 「コストカット」「生産性向上」は取り組みやすいが、既存の範囲内での改善にとどまる

2 章

  • TODO

    3 章

  • TODO

    4 章

  • TODO

    5 章

  • TODO

    6 章

  • TODO

    7 章

  • TODO

    8 章

  • TODO

    9 章

  • TODO

AWS Certified Solutions Architect (SAA-C03) 認定試験向けのメモ

サービス

分析

  • Amazon Athena

    • S3 上のデータに対して 標準SQL を実行できるデータ分析サービス (サーバレス)
  • Amazon EMR (Amazon Elastic MapReduce)

  • Amazon Redshift

  • AWS Data Exchange

  • AWS Data Pipeline

  • AWS Glue

    • ETLツール (フルマネージド、サーバレス)
    • S3 や DynamoDB などからデータを抽出し、変換したのちにデータベースへ保存
    • memo
      • Glueはバッチ処理に適しており、リアルタイム処理には Managed Service for Apache Flink の方が適切
  • Amazon Kinesis

    • ストリーミングデータのリアルタイム処理
    • Data Streams
      • 外部から送信されるストリーミングデータを収集
      • 大量のリアルタイム性の高いデータ処理
        • ストリーミングデータを直接読み取り、カスタムアプリケーション(Kinesis Data Analytics や Lambda)でリアルタイム処理
      • データの保存や検索はできない
    • Data Firehose
  • AWS Managed Service for Apache Flink (旧 Kinesis Data Analitics)

    • Amazon Kinesis からのデータストリームをリアルタイムで処理・分析
    • 異なる形式のデータを統一された形式に変換することも可能
  • AWS Lake Formation

  • Amazon MSK (Amazon Managed Streaming for Apache Kafka)

  • Amazon OpenSearch Service (Amazon Elasticsearch Service)

  • Amazon QuickSight

    • 様々なデータソースを基にダッシュボードやレポート、グラフを作成してデータを可視化するサービス

アプリケーション統合

  • Amazon EventBridge (Amazon CloudWatch Events)

    • AWSアカウント内で発生したイベントを検知し、アクションを自動実行
  • Amazon MQ

    • メッセージブローカー (マネージドサービス)
      • Apache ActiveMQ や RabbitMQ を使用して、分散システム間でメッセージをやり取りするための信頼性の高いメッセージキューイングを提供
  • Amazon SNS (Amazon Simple Notification Service)

  • Amazon SQS (Amazon Simple Queue Service)

  • AWS Step Functions

    • ワークフローを作成して実行
  • Amazon AppFlow

    • 様々なSaaSアプリケーション(例:Salesforce、ServiceNow、Slackなど)と、AWSサービス(例:Amazon S3、Redshift、DynamoDBなど)間でデータを安全に転送できるフルマネージドサービス
      • デフォルトでAWSのKey Management Service(KMS)が有効になっており、データは保存時および転送中に暗号化される
  • AWS AppSync

AWS コスト管理

コンピューティング

コンテナ

データベース

  • Amazon RDS

    • 自動バックアップ
      • 最大 35 日
        • それ以上は AWS Backup で
    • RDS for SQL Server
    • 備考
      • オンプレからのインポート
        • オンプレの PostgreSQL から、RDS for PostgreSQL へ直接インポートはできない
        • => 一旦、S3にダンプファイルをおいて、インポート
  • Amazon Aurora

  • Amazon Aurora Serverless

    • 自動でスケール
  • Amazon DynamoDB

    • KVS
    • グローバルテーブル
      • 複数のリージョンにまたがって運用できる
    • DynamoDB Streams
      • テーブルに対して行われた直近の24時間の変更(追加や更新、削除)をログに保存する機能
        • 非同期で動作するため、ストリームを有効にしても元のテーブルのパフォーマンスには影響を与えない
  • Amazon ElastiCache

    • 種類
      • for Redis
        • 永続性あり
      • for Memcached
        • 永続性なし
    • キャッシュ戦略
      • ライト(書き込み)スルー戦略
        • データベースへのデータ書き込みや更新が行われるたびに、同時にキャッシュにも書き込み
      • 遅延読み込み戦略
        • データベースへの書き込みを優先し、必要な時にのみキャッシュにデータを書き込み
      • TTL
        • データに保存期間を設定し、その期間が経過すると自動的にキャッシュからデータを削除
  • Amazon Redshift

  • Amazon DocumentDB (with MongoDB compatibility)

  • Amazon Keyspaces (for Apache Cassandra)

  • Amazon Neptune

    • グラフデータサービス (マネージメントサービス)
      • 関係性、相関情報を扱う (SNS、レコメンデーションエンジン)
  • Amazon QLDB (Amazon Quantum Ledger Database)

  • Amazon Timestream

マネジメント と ガバナンス

  • AWS CloudWatch

    • AWSサービスやオンプレミスのシステムを監視するサービス
      • リソース(CPU使用率やストレージの使用状況など)の状態に応じたアクションを取らせることができる
    • 機能
  • AWS Auto Scaling

    • スケーリングポリシー
      • 動的スケーリング
        • シンプルスケーリング
          • 特定のメトリクス(CPU使用率など)に対する1つのしきい値に基づいてスケーリングを実施
        • ステップスケーリング
          • 特定のメトリクスに対する複数のしきい値に基づいてスケーリングを段階的に実施
        • ターゲット追跡スケーリング
          • 特定のメトリクスが指定した目標値になるようにスケーリングを実施 (増減するインスタンス数はAWS側で調整)
      • スケジュールに基づくスケーリング
      • 予測スケーリング
      • 手動スケーリング
    • ヘルスチェック
      • EC2
      • ELB
  • AWS CloudFormation

    • AWSクラウド上での環境構築を自動で行うサービス
    • IaC サービス
      • テンプレートを用いて自動プロビジョニング
  • AWS CloudTail

    • AWSアカウント内のAPIリクエストとその結果を記録
  • AWS Config

    • AWSリソースの設定情報を記録
  • AWS CLI (AWS Command Line Interface)

  • AWS Management Console

  • AWS Organizations

    • 複数のAWSアカウントをグループ化し、アカウント群の管理を一元的に行うサービス
      • 管理アカウントが1つ存在
      • 管理アカウントの下に、OUと呼ばれる論理グループを複数作成
    • 機能
      • 一括請求
      • 使用量の結合
      • AWS Biling Conductor
      • AWS Resource Access Manager
      • AWS License Manager
      • AWS Control Tower
        • Organizations組織のベストプラクティス構成を自動作成
    • サービスコトロールポリシー(Service Control Policy:SCP)
      • 組織に属しているOU(Organizational Unit)またはAWSアカウントに対して、利用できるAWSサービスやアクションを制限
        • SPCで制限された機能は、アカウント内のIAMユーザー、IAMロールで権限を付与しても使えない
  • AWS Systems Manager

    • EC2 を中心に AWS の運用を広い範囲でサポート
      • パッチマネージャー
      • セッションマネージャー
      • パラメータストア
      • AppConfig
    • AWS Systems Manager Run Command
      • AWSのEC2インスタンスやオンプレミスのサーバーに対してリモートでコマンドやスクリプトを安全に実行する機能
        • サーバーにログインしなくても安全でセキュアに大規模なサーバー群をリモートで管理できる
          • 踏み台サーバー、手動でのSSH接続などが不要
  • AWS Trusted Advisor

    • ユーザーのAWSアカウント環境の状態を自動チェック
    • コスト削減やパフォーマンス向上の推奨事項を提供
  • AWS Compute Optimizer

    • コンピューティングリソースの設定と使用状況を分析し、コスト最適化とパフォーマンス向上のための推奨事項を提供
  • AWS Managed Grafana

  • AWS Managed Service for Prometheus

  • AWS Personal Health Dashboard

  • AWS Service Catalog

    • 主にCloudFormationテンプレートを製品として登録し、他のAWSユーザーへ共有できるサービス
      • 製品の管理者は、製品のバージョンや、製品がいつ・誰に使用されたかを一元的に管理できる
  • AWS Proton

    • マイクロサービスやコンテナ化されたアプリケーションのインフラ管理を自動化
      • 開発チームが標準化されたテンプレートを使って、インフラのプロビジョニングやデプロイを効率的に行えるようにする
  • AWS Well-Arhcitected Tool

フロントエンドの WEB と Mobile

  • Amazon API Gateway

    • RESTful API や WebSocket API を簡単に作成して公開
      • バックエンドアプリケーション(例えば、AWS Lambda、ECS、S3、DynamoDBなど)にルーティング
    • note
  • AWS Amplify

  • AWS Device Farm

  • Amazon Pinpoint

デベロッパーツール

メディアサービス

  • Amazon Elastic Transcoder (= 新しいAWS Elemental MediaConvert の利用を推奨)

  • Amazon Kinesis Video Streams

機械学習

移行 と 転送

  • AWS Snow Family

  • AWS Application Discovery Service

  • AWS Applicatiion Migration Service (CloudEndure Migration)

  • AWS DMS (AWS Database Migration Service)

    • memo DBスナップショットからの移行は行えない
  • AWS DataSync

    • オンプレミスとAWS間、またはAWSストレージ間のデータ転送サービス
      • データは暗号化されて転送されるため、安全かつ高速なデータ転送を行える
      • 移行元として、オンプレミス側のファイルサーバもサポート
        • オンプレミス側にDataSyncエージェントをインストール
    • note
  • AWS Migration Hub

  • AWS SMS (AWS Server Migration Service)

  • AWS Transfer Family

セキュリティ、アイデンティティコンプライアンス

  • IAM (AWS Identity and Access Management)

    • 構成要素
      • IAM ユーザー //認証
      • IAM グループ
        • 複数のIAMユーザーをまとめたもの
      • IAM ロール //認証
        • 用途
          • AWSサービスに一時的なアクセス権限を付与
        • memo
          • IAMロールをIAMグループにアタッチすることはできません
      • IAM ポリシー //認可
        • IAMユーザー、IAMグループ、IAMロールにアタッチするポリシー
          • ポリシー = AWSリソースへのアクセスに対する権限を定義したもの
    • 使い方
      • 各IAMユーザーをIAMグループとしてまとめ、IAMグループに対して必要な権限を定義したIAMポリシーを適用することで、効率的な権限管理を実現
  • AWS KMS (AWS Key Management Service)

    • データを暗号化するための鍵を作成・管理
  • ACM (AWS Certificate Manager)

    • SSL/TLS証明書を作成・管理
  • AWS Secrets Manager

    • APIキーなどのシークレットを安全に保管し、アプリケーション(=EC2インスタンスやLambda関数など)から共有利用できるようにする
  • AWS WAF

    • 脆弱性を突く攻撃からの保護
    • 機能
      • Web ACL
        • CloudFront の 地理的制限 と同等の機能
    • AWS WAF を設定可能なサービス
    • 設定不可
      • S3
  • AWS Shield

    • DDoS 保護
  • Amazon GuardDuty

    • 脅威を自動的に検出
      • CloudTrailのログ、VPCフローログ、DNSクエリログを自動的に分析
  • Amazon Inspector

  • AWS CloudHSM

  • Amazon Cognito

    • Webアプリケーション、モバイルアプリケーションのエンドユーザーを管理
    • 機能
      • Cognito ユーザープール
        • SingUp, SignIn
      • Cognito ID プール
        • Cognito ユーザープール、または Goolge,Fackbook など他の IDP で SignIn したユーザーに、IAMロールを連携させることで、AWSサービスへのアクセス権限を付与
  • AWS Single Sign-On

  • AWS Artifact

    • AWSが受けた第三者の監査機関による検査のレポートをユーザーに提供
      • why: ユーザーはAWSのデータセンターを訪れることができない (インフラが保護されているかを直接見れない)
  • AWS Audit Manager

  • Amazon Detective

  • AWS Directory Service

  • AWS Firewall Manager

  • Amazon Macie

    • S3バケット内のデータ保護
    • 個人情報(PII)や秘匿技術などの機密データを識別・分類
  • AWS Network Firewall

  • AWS RAM (AWS Resource Access Manager)

  • AWS Security Hub

    • Macie, GuardDuty, Inspector などのイベントを集約し、ダッシュボードで管理

ネットワーク と コンテンツ配信

  • AWS VPC

    • VPC エンドポイント
      • what
        • VPC内から、VPC外のAWSサービス(S3, DynamoDB 等)に接続
          • インターネットを経由せずに接続できる
      • エンドポイント
        • VPC リンク (インターフェースエンドポイント)
          • プライベートサブネット内のAWSリソースへ直接アクセスすることができる
        • ゲートウェイエンドポイント
          • 利用するには、ルートテーブルの変更が必要
  • AWS Route 53

    • フェイルオーバールーティングポリシー
    • ヘルスチェック
    • ホストゾーン
      • パブリックホストゾーン
        • 公開インターネット向け
      • プライベートホストゾーン
        • 内部ネットワーク専用
  • ELB (Elastic Load Balancing)

    • NLB (L4) //Network
    • ALB (L7) //Application
      • HTTP、HTTPS
      • WebSocket
      • memo
        • ALB のフェイルオーバーの自動化には Route 53 のヘルスチェックが必要
    • CLB (L4, L7) //Classic
      • WebSocket 非対応
  • Amazon CloudFront

    • エッジロケーションを使い、低レイテンシーでコンテンツを配信 (CDN、Contents Deliveriy Network)
    • 機能
      • アクセス制限
        • OAI(Origin Access Identity)
          • クライアントからオリジナルコンテンツへの直接アクセスを制限
        • 地理的制限
          • クライアントからのアクセスを国別に制限できる
      • Lambda@Edge
        • CloudFront は配信するコンテンツに対して、カスタマイズされた関数を実行
  • AWS Global Accelerator

    • ユーザーからAWSリソースまでのアクセス経路を、AWSネットワークを利用して最適化するサービス
    • Route 53 よりも高速なフェイルオーバー
  • AWS Transit Gateway

    • 複数のVPCやオンプレミスネットワークを一元的に接続・管理するためのハブ型ネットワーキングサービス
      • 大規模なネットワーク構成をシンプルにし、管理を効率化
  • AWS Direct Connect

    • オンプレミスのデータセンターと、AWS専用線でプライベート接続
  • AWS VPN (AWS Site-to-Site VPN)

    • オンプレミスネットワークとAWSVPCを安全に接続するためのVPNサービス
  • AWS PrivateLink

    • VPC 内から他のAWSサービスやオンプレミスサービスへのプライベート接続を提供

サーバレス

  • AWS Fargate

    • memo
      • コンテナタスクの起動場所として、EC2を使わない
  • AWS Lambda

  • AWS AppSync

    • GraphQL 及び Pub/Sub API を使用して、アプリケーションやサービスを、データやイベントに接続
      • 例: GraphQL API を使って、アプリケーションから安全に DynamoDB テーブルに接続

ストレージ

  • Amazon S3

    • オブジェクトストレージ
    • 機能
      • オブジェクトロック
        • 指定した保持期間中オブジェクトを読み取り専用にする
        • モード //動作は同じ、対象ユーザーが異なる
          • ガバナンスモード //統制、管理
            • 対象: 権限(s3:BypassGovernanceRetention)を持たないユーザー
          • コンプライアンスモード //法令遵守
            • 対象: ルートユーザーを含む全てのユーザー
      • S3レプリケーション
      • One Zone-IA
        • 1か所のAZにのみ保存
          • AZに障害が発生した場合はデータが消失する可能性
      • Transfer Acceleration
        • グローバルに分散したエッジロケーションを利用して、S3へのデータ転送を高速化
          • S3へのデータアップロードを高速化するためのもの
      • リクエスタ支払い
        • アクセス元に対して転送料金が請求される
    • S3 ファイルゲートウェイ
    • note
      • セキュリティグループは設定できない
      • 直接 WAF を有効にできない
        • CloudFront 経由で
  • Amazon S3 Glacier

    • ストレージクラス
      • Interlligent - Tiering
        • アクセスパターンが変化、不明
      • xxx IA (Infrequent Access)
        • 頻繁にはアクセスされないが、必要なときに迅速にアクセスできる必要があるデータの保存に最適化
      • Flexible Retrieval
        • IA より低価格
      • Deep Archive
        • データの取り出しに長時間がかかる
          • 標準取り出し
            • 最大 12 時間
          • 大容量取り出し
            • 最大 48 時間
  • AWS Storage Gateway

    • iSCSI接続を使用してオンプレミスのブロックデータをS3に保管
    • オンプレミス から AWS のストレージサービス(= S3, FSx For Windows ファイルサーバ) へのアクセスを高速かつセキュアに行う
      • キャッシュ型
      • 保管型
    • memo
      • ファイルベースのプロトコル(例:NFS、SMB)には非対応
        • DataSync は NFS、SMB をサポート
  • AWS EBS (AWS Elastic Block Store)

  • Amazon EFS (Amazon Elastic File System)

  • Amazon FSx (すべてのタイプに対応)

  • AWS Backup

    • ストレージやデータベース等のバックアップを一元管理 (フルマネージド サービス)
      • 以前はサービスごとに行っていたバックアップ作業を統合できる
    • memo
      • 全体のシステムやアーキテクチャのバックアップ・リストアの目的では利用できません

その他

用語

  • ベアメタル環境

    • 仮想化技術を使用せず、物理的なコンピューターハードウェア上に直接インストールされたオペレーティングシステム(OS)やアプリケーション
  • ワークロード

  • ETL

    • Extract(抽出)、Transform(変換)、Load(ロード)の頭文字をとった略語
    • さまざまなソースからデータを抽出し、取り扱いやすい形にデータを変換し、DWH などのデータシステムに書き出すプロセス
  • フェデレーション

    • 複数の異なるドメインや組織間で、ユーザーの認証情報を共有・統合する仕組み
      • => 「SSO」を「異なる組織間」で可能にするための技術や枠組み

ACL vs セキュリティーグループ

  • ACL

    • IPアドレスを元に許可ルールと拒否ルールの両方を設定可能
  • セキュリティグループ

    • 許可のみ可能

DataSync vs Storage Gateway

  • DataSync

  • Storage Gateway

    • AWSへデータを移行した後もオンプレミスから継続してデータが更新されるケースで利用
    • ファイルベースのプロトコル(例:NFS、SMB)には非対応
  • 公式のユースケース

    • DataSyncで一括移行したあと、Storage Gatewayで継続的な更新に使用す

転送時間

  • 暗記しておくとよいこと

    • 1TB のデータを 1Gbps で転送すると、約 2.2 H かかる
    • 600TB を 600 Mbps で転送 の計算
      • 2.2 × 600 / 0.6 = 2,200 H
  • 600TB を 600 Mbps で転送

    • 94 日
    • 計算式
      • 600TB を bit に変換
        • 600,000(T),000(G),000(M),000(k) * 8
        • = 4,800,000(T),000(G),000(M),000(k)
      • 4,800,000(T),000(G),000(M),000(k) / 600,000(M),000(k)
        • 4,800,000,000 / 600
        • 48,000,000 / 6
        • 8,000,000 s
      • 8,000,000 s
        • = 8,000,000 / 3,600
        • 2,222 H
        • 92 日
  • 8TB を 300 Mbps で転送

    • 2.2 H * 8 / 0.3
      • 58 H
      • 2.4 日

MUIのスタイリング方法

MUI v5

  • スタイリングは Emotion or styled components を利用できる

CSS-in-JSライブラリ

  • JSS (JavaScript Style Sheets)

    • MUI v4 では makeStyles と JSS を組み合わせてスタイリング
      • MUI v5 で makeStyles が非推奨になった
  • styled components

    • CSS-in-JS(JavaScript内でCSSを記述すること)のためのライブラリ
    • JavaScriptのテンプレートリテラルを使用してスタイルを定義できる
    • MUI v5 で利用可能
  • Emotion

    • CSS-in-JS(JavaScript内でCSSを記述すること)のためのライブラリ
    • JavaScriptのオブジェクトやCSS構文を使用してスタイルを定義できる
    • MUI v5 で利用可能

MUI v5 でのスタイリング方法

  • (MUIの) sx prop

  • (MUIの) css prop

    • 以下のいずれかで生成したスタイルオブジェクトを渡すことが可能
  • sx prop vs css prop

    • スタイルを別ファイルに分ける必要が無いような軽微なスタイリングは sx prop を使用すると良さそう

Laravel: Facade vs Contract

自分の言葉で言語化してメモ

Facade vs Contract

  • Facade と Contract はどちらも Laravel のコア機能を使う為の方法である

Facade

  • what
    • Laravelのコア機能をサービスコンテナを介さずに利用できる静的なインターフェース
  • メリット
    • サービスコンテナを意識することなくサービスに簡単にアクセスできる
  • デメリット
    • インジェクション(コンストラクタインジェクションまたはメソッドインジェクション)なしで利用できてしまう為、依存性の管理が難しくなり、テストが困難になる

※とはいえ、Facade も Laravel の内部でサービスコンテナに登録されてる
See: \Illuminate\Foundation\Application::registerCoreContainerAliases

Contract

  • what
    • Laravelのコア機能のインターフェース
    • 開発者は、ServiceProviderでContract(Interface)と実装クラスを明示的にbindする事で、サービスコンテナ経由でコア機能を利用する事ができる
  • メリット
    • 依存性の注入ができる為、疎結合になる
    • テストがしやすくなる
  • デメリット
    • サービスコンテナでのbindが必要

用語

Contract vs Interface

Laravelにおいて Contract(契約) という用語は、サービスコンテナに登録するために使用される Interface を指す

  • Contract (契約)
    • Laravelのコア機能のInterface
    • 言い換えると、サービスコンテナに登録するサービスのInterface

Azure Application Insights への特定のログ出力を Azure Monitor で監視し、Slack 通知する方法

先日、Azure Function の異常終了を検知し、Slack に通知する仕組みを構築しました。
今回は、Azure Application Insights に特定のログが出力されたら Slack に通知する仕組みを構築する手順を書きます。

使用するもの

  • Slack
    • 通知を受けるチャンネル
    • Incoming Webhook
  • Azure
    • Azure Application Insights ※エラーログの出力先
    • Azure Monitor ※エラーログを監視する
      • アクショングループ
      • アラートルール
    • Logic App ※エラーログ発生時に、Azure Monitor からトリガーし、Slack Incoming Webhook にメッセージを送信

概要

  1. Azure Function が異常終了すると Azure Function に severityLevel が 3 のログ(※1)が出力される
  2. Azure Monitor の アラートルール で上記のログの出力を監視
  3. ログを検知したら、アラートルール の アクショングループ から Locig App をトリガーする
    • アラートルールから直接、Slack の Incoming Webhook にメッセージを送信できない為、Locic Apps 経由で送信します
      • Logic Apps で Slack の Incoming Webhook に対応した payload を生成して送信する必要がある
  4. Logic Apps から Slack の Incoming Webhook にメッセージを送信

※1 のログを検索する KQL

traces | where operation_Name contains "対象Function名" 
  and message contains "Executed 'Functions.対象Function名'"
  and severityLevel != 1

構築手順

  1. Incoming Webhook の URL を取得
  2. (Azure Monitor から Logic App に送信されるペイロードを取得しておく)
    • Logic App 作成時に、要求本文のJSONスキーマ を設定します。この際、実際のペイロードを元に、スキーマを生成する為、予めペイロードを取得しておきます。
  3. Logic App を作成
  4. Azure Monitor の アクショングループ を作成
  5. Azure Monitor の アラートルール を作成

0. 監視対象の Azure Function を作成

  • 今回はログ監視の構築が主旨の為、Azure Portal 上でTimer Trigger の Function を作成し、5分毎に実行結果のログが Application Insights に出力されるようにしておきます

1. Incoming Webhook の URL を取得

  • 後ほど Logic App からの送信先に指定しますので、Webhook URL をコピーしておきます。

2. Azure Monitor から Logic App に送信されるペイロードを取得

  • ※後ほど、Logic Appのワークフローで送信するSlack通知メッセージに、アラート内容等を含める為に、 要求本文のJSONスキーマ の作成が必要になります

    • 要求本文のJSONスキーマ の作成に、実際のペイロードが必要な為、予め取得しておきます
  • 公式ドキュメントにペイロードのサンプルがあるので、どのサンプルが利用できれるかを予め把握できている場合は 手順 2. はスキップしてok です。

  • 取得方法としては、Logic Appを仮設定で作成し、アクショングループの作成(手順 4.)、及び、アラートルールの作成(手順 5.)を行い、一度、実際にペイロードを受信します

  • トリガーを HTTP要求の受信時 とし、要求本文のJSONスキーマ{} で作成します

    • (ここではペイロードが取得しただけなので) 以降のアクション(= HTTP の部分)は未設定でもok
  • (アラートルールからLogic Appがトリガーされるのを待つ)

  • Logic Appsの実行履歴より、ペイロードを取得します

  • 採取したペイロード

{
  "schemaId": "azureMonitorCommonAlertSchema",
  "data": {
    "essentials": {
      "alertId": "/subscriptions/c86f8ad8-7f32-4f84-8cf5-9ba182bd2a40/providers/Microsoft.AlertsManagement/alerts/ddc294f2-8510-62be-114c-4fd9e3300027",
      "alertRule": "TimerTrigger1関数のエラー終了",
      "severity": "Sev2",
      "signalType": "Log",
      "monitorCondition": "Fired",
      "monitoringService": "Log Alerts V2",
      "alertTargetIDs": [
        "/subscriptions/c86f8ad8-7f32-4f84-8cf5-9ba182bd2a40/resourcegroups/blog20231223/providers/microsoft.insights/components/sampleapptimertrigger"
      ],
      "configurationItems": [
        "/subscriptions/c86f8ad8-7f32-4f84-8cf5-9ba182bd2a40/resourceGroups/blog20231223/providers/microsoft.insights/components/SampleAppTimerTrigger"
      ],
      "originAlertId": "bef8427b-d266-440e-84be-4cbe66cd588e",
      "firedDateTime": "2023-12-23T03:23:02.1147771Z",
      "description": "TimerTrigger1関数がエラー終了しました",
      "essentialsVersion": "1.0",
      "alertContextVersion": "1.0"
    },
    "alertContext": {
      "properties": {},
      "conditionType": "LogQueryCriteria",
      "condition": {
        "windowSize": "PT1H",
        "allOf": [
          {
            "searchQuery": "traces | where operation_Name contains \"TimerTrigger1\" \nand message contains \"Executed 'Functions.TimerTrigger1'\"\nand severityLevel == 1",
            "metricMeasureColumn": null,
            "targetResourceTypes": "['microsoft.insights/components']",
            "operator": "GreaterThan",
            "threshold": "1",
            "timeAggregation": "Count",
            "dimensions": [],
            "metricValue": 8,
            "failingPeriods": {
              "numberOfEvaluationPeriods": 1,
              "minFailingPeriodsToAlert": 1
            },
            "linkToSearchResultsUI": "https://portal.azure.com#@6a02fd2f-7f98-4f16-9639-951b0994621f/blade/Microsoft_Azure_Monitoring_Logs/LogsBlade/source/Alerts.EmailLinks/scope/%7B%22resources%22%3A%5B%7B%22resourceId%22%3A%22%2Fsubscriptions%2Fc86f8ad8-7f32-4f84-8cf5-9ba182bd2a40%2FresourceGroups%2Fblog20231223%2Fproviders%2Fmicrosoft.insights%2Fcomponents%2FSampleAppTimerTrigger%22%7D%5D%7D/q/eJxVjDsOwkAMBXtOYW2TDikHSAkVokqPrM3TxhLrRbYDQeLwfKpQTTMzYZzh9KLHDAO1G4xDml7OXEG5abCoUxqlwkaTUmB9oh3rRBXuXLbWYUVeAhN1x0Xz9%2BP7v7JLv9Jxh0k8Tx9eaRiofwM%3D/prettify/1/timespan/2023-12-23T02%3a22%3a25.0000000Z%2f2023-12-23T03%3a22%3a25.0000000Z",
            "linkToFilteredSearchResultsUI": "https://portal.azure.com#@6a02fd2f-7f98-4f16-9639-951b0994621f/blade/Microsoft_Azure_Monitoring_Logs/LogsBlade/source/Alerts.EmailLinks/scope/%7B%22resources%22%3A%5B%7B%22resourceId%22%3A%22%2Fsubscriptions%2Fc86f8ad8-7f32-4f84-8cf5-9ba182bd2a40%2FresourceGroups%2Fblog20231223%2Fproviders%2Fmicrosoft.insights%2Fcomponents%2FSampleAppTimerTrigger%22%7D%5D%7D/q/eJxVjDsOwkAMBXtOYW2TDikHSAkVokqPrM3TxhLrRbYDQeLwfKpQTTMzYZzh9KLHDAO1G4xDml7OXEG5abCoUxqlwkaTUmB9oh3rRBXuXLbWYUVeAhN1x0Xz9%2BP7v7JLv9Jxh0k8Tx9eaRiofwM%3D/prettify/1/timespan/2023-12-23T02%3a22%3a25.0000000Z%2f2023-12-23T03%3a22%3a25.0000000Z",
            "linkToSearchResultsAPI": "https://api.applicationinsights.io/v1/apps/ec3b3196-ebf9-49af-814c-585faba48434/query?query=traces%20%7C%20where%20operation_Name%20contains%20%22TimerTrigger1%22%20%0Aand%20message%20contains%20%22Executed%20%27Functions.TimerTrigger1%27%22%0Aand%20severityLevel%20%3D%3D%201&timespan=2023-12-23T02%3a22%3a25.0000000Z%2f2023-12-23T03%3a22%3a25.0000000Z",
            "linkToFilteredSearchResultsAPI": "https://api.applicationinsights.io/v1/apps/ec3b3196-ebf9-49af-814c-585faba48434/query?query=traces%20%7C%20where%20operation_Name%20contains%20%22TimerTrigger1%22%20%0Aand%20message%20contains%20%22Executed%20%27Functions.TimerTrigger1%27%22%0Aand%20severityLevel%20%3D%3D%201&timespan=2023-12-23T02%3a22%3a25.0000000Z%2f2023-12-23T03%3a22%3a25.0000000Z"
          }
        ],
        "windowStartTime": "2023-12-23T02:22:25Z",
        "windowEndTime": "2023-12-23T03:22:25Z"
      }
    },
    "customProperties": {}
  }
}

3. Logic App を作成

  • プランの種類=消費 で作成します

  • ロジック アプリ デザイナー でワークフローを作成します

  • アラートルール からの HTTPリクエストをトリガーとする想定の為、HTTP 要求の受診時 を選択します

  • 上記で取得したペイロードを使用してスキーマを生成します

  • +新しいステップ を押下し、HTTP アクションを追加します

    • URI に Slack の Incoming Webhook のエンドポイントを指定
    • 本文 に、Slack Incoming Webhook のメッセージの送り方 (※2) に準拠したJSONを登録
      • メッセージに 動的なコンテンツの追加 よりdescriptionlinkToSearchResultsUI を含める事で、アラート概要と、当該KQLへのリンクをメッセージに含める事ができます
  • ※2 Slack Incoming Webhook のメッセージの送り方

  • 保存します

4. Azure Monitor の アクショングループ を作成

  • アクションタブより、上記で設定した Logic Apps をアラート発生時のアクションとして設定します

  • テストを実行し、Logic App 経由で Slack 通知が届く事を確認しておきます

5. Azure Monitor の アラートルール を作成

  • 監視対象の Function の 監視 > ログ より、Application Insights の画面に移動します

  • 監視対象となるログを検索し、+新しいアラートルール を押下します

※今回は severityLevel3 のログは出力されないので 1 を監視対象にしています

traces | where operation_Name contains "TimerTrigger1" 
and message contains "Executed 'Functions.TimerTrigger1'"
and severityLevel == 1
  • 以下の内容でアラートルールを作成します

  • 留意点

    • 以下の意味になります
      • 集計の粒度 = 過去何分間で出力されたログをアラート対象にするか
      • 評価の頻度 = 何分起きにログをチェックするか
    • 今回は、 集計の粒度 = 1時間、評価の頻度 = 5分 とし、過去1時間以内のログを、5分おきに監視します
  • アラート タブより、アラート検知時のアクションを、上記で作成したアクショングループに設定します

  • 詳細 タブより、アラートルール名 アラートルールの説明 を設定します

    • アラートルールの説明手順 3.動的なコンテンツ として取得できるので、 Slack 通知メッセージで利用します

Slack通知内容

  • エラーログを検知すると以下のSlack通知が飛ぶようになりました!
    • リンクから対象のエラーログに飛べます