ゼファーネットのロゴ

クロスアカウント Amazon Kinesis Data Streams から AWS Lambda 関数を呼び出す |アマゾン ウェブ サービス

日付:

AWS のマルチアカウント アーキテクチャは、ワークロードを分離し、きめ細かいコスト割り当てを可能にし、異なる環境間でのコラボレーションを促進することにより、セキュリティ、コンプライアンス、リソース管理を強化するために不可欠です。また、リスクが軽減され、拡張性が向上し、高度なネットワーク構成が可能になります。

ストリーミング アーキテクチャでは、ビジネスと IT の要件に応じて、イベント プロデューサー、ストリーム ストレージ、およびイベント コンシューマーを 1 つのアカウントに含めることも、異なるアカウントに分散することもできます。たとえば、会社では、さまざまなアカウントにわたる複数の異なるプロデューサーからのクリックストリーム データやログ データを一元管理したいと考えている場合があります。マーケティング、製品エンジニアリング、または分析のデータ利用者は、アカウント間で同じストリーミング データにアクセスする必要があり、そのためにはマルチアカウント ストリーミング アーキテクチャを提供する機能が必要です。

マルチアカウント ストリーミング アーキテクチャを構築するには、次を使用できます。 Amazon Kinesisデータストリーム ストリームストレージとして、そして AWSラムダ イベントコンシューマとして。 Amazon Kinesis Data Streams により、大規模なストリーミング データのリアルタイム処理が可能になります。 Lambda と統合すると、サーバーレスのデータ処理が可能になり、インフラストラクチャを管理せずにリアルタイムでデータ ストリームを分析して対応できるようになります。この統合は、リアルタイム分析、ログ処理、モノのインターネット (IoT) データ取り込みなどを含むさまざまなユースケースをサポートしており、ストリーミング データからタイムリーな洞察を必要とする企業にとって価値があります。この投稿では、あるアカウントのストリームに取り込まれたデータを、別のアカウントの Lambda 関数を使用して処理する方法を示します。

最近リリースされた Kinesis Data Streams のサポート リソースベースのポリシー 別のアカウントから Lambda を呼び出すことができます。リソースベースのポリシーを使用すると、AWS アカウントを指定できます。 AWS IDおよびアクセス管理 (IAM) ユーザー、または IAM ロール、およびアクセスを許可する正確な Kinesis Data Streams アクション。アクセスが許可されたら、別のアカウントで Lambda 関数を設定して、自分のアカウントに属するデータ ストリームの処理を開始できます。これにより、両方のアカウントで Lambda 関数を使用してストリーミング データをコピーする必要がなくなるため、コストが削減され、データ処理パイプラインが簡素化されます。データ ストリームまたは登録済み消費者へのアクセスを共有しても、アカウントに追加料金はかかりません。 Kinesis Data Streams リソースのクロスアカウント使用は、引き続きリソース所有者に請求されます。

この投稿では、Kinesis Data Streams を使用します。 強化されたファンアウト 機能を利用して、消費者にアプリケーションに合わせた専用の読み取りスループットを提供します。デフォルトでは、Kinesis Data Streams はコンシューマ間でシャードあたり 2 MB/秒の共有読み取りスループットを提供しますが、ファンアウトが強化されているため、各コンシューマはシャードあたり 2 MB/秒の専用スループットを享受できます。この柔軟性により、Kinesis Data Streams を特定の要件にシームレスに適応させることができ、ニーズに応じて専用スループットまたは共有スループットの拡張ファンアウトを選択できます。

ソリューションの概要

このソリューションでは、Kinesis Data Streams をアカウント 1 にデプロイし、Lambda をアカウント 2 のコンシューマーとしてデプロイして、データストリームからデータを受信します。次の図は、高レベルのアーキテクチャを示しています。

Amazon KDS-Lambda クロスアカウントソリューションアーキテクチャ

セットアップには次の重要な要素が必要です。

  • アカウント 1 の Kinesis データ ストリームとアカウント 2 の Lambda 関数
  • アカウント 1 の Kinesis Data Streams リソースポリシー。クロスアカウント Lambda 実行ロールが Kinesis データストリーム上で操作を実行できるようにします。
  • アカウント 2 の Lambda 実行ロールとアカウント 1 の拡張ファンアウトコンシューマーリソースポリシーにより、クロスアカウント Lambda 実行ロールが Kinesis データストリームで操作を実行できるようになります。

セットアップには 3 つを使用します AWS CloudFormation 主要なリソースを作成するためのテンプレート:

  • CloudFormation テンプレート 1 は、アカウント 1 に次の主要なリソースを作成します。
    • Kinesis データストリーム
    • Kinesis データストリームの拡張ファンアウトコンシューマー
  • CloudFormation テンプレート 2 は、アカウント 2 に次の主要なリソースを作成します。
    • コンシューマーラムダ関数
    • コンシューマ Lambda 関数実行ロール
  • CloudFormation テンプレート 3 は、アカウント 2 に次のリソースを作成します。
    • コンシューマ Lambda 関数のイベント ソース マッピング

このソリューションは単一リージョンのデプロイをサポートしており、CloudFormation テンプレートは異なる AWS アカウント間で同じリージョンにデプロイする必要があります。このソリューションでは、Kinesis Data Streams の拡張ファンアウトを使用します。これは、複数のコンシューマーにわたって大きなスループットを必要とするアーキテクチャをデプロイするためのベストプラクティスです。このソリューションを展開するには、次のセクションの手順を完了してください。

前提条件

2 つの AWS アカウントと、CloudFormation テンプレートを実行してソリューション アーキテクチャで説明されているサービスを作成するために必要な権限が必要です。また、 AWSコマンドラインインターフェイス (AWS CLI) がインストールされている、バージョン 2.15 以降。

CloudFormation テンプレート 1 を起動する

最初の CloudFormation テンプレートを起動するには、次の手順を実行します。

  1. にサインインする AWSマネジメントコンソール アカウント 1 として、適切な AWS リージョンを選択します。
  2. ダウンロードして起動 CloudFormation テンプレート 1 Kinesis データストリームをデプロイする場所。
  3. LambdaConsumerAccountId、Lambda コンシューマー アカウント ID を入力し、[送信] をクリックします。 CloudFormation テンプレートのデプロイが完了するまでに数分かかります。
  4. スタックが完了したら、AWS CloudFormation コンソールでスタックに移動します。 出力 タブをクリックして、次のパラメータの値をコピーします。
    • KinesisStreamArn
    • KinesisStreamEFOConsumerArn
    • KMSKeyArn

これらの値は後の手順で必要になります。

CloudFormation テンプレート 2 を起動する

2 番目の CloudFormation テンプレートを起動するには、次の手順を実行します。

  1. アカウント 2 としてコンソールにサインインし、適切なリージョンを選択します。
  2. ダウンロードして起動 CloudFormation テンプレート 2 Lambda コンシューマーをホストする場所。
  3. 前のステップで取得した次の入力パラメータを指定します。
    • KinesisStreamArn
    • KinesisStreamEFOConsumerArn
    • KMSKeyArn

CloudFormation テンプレートは、次の主要なリソースを作成します。

  • ラムダコンシューマ
  • Lambda 実行ロール

Lambda 関数の実行ロールは、AWS のサービスとリソースにアクセスするためのアクセス許可を関数に付与する IAM ロールです。ここでは、必要な Kinesis Data Streams および Lambda 呼び出し権限を持つ Lambda 実行ロールを作成します。

CloudFormation テンプレートのデプロイが完了するまでに数分かかります。

  1. スタックが完了したら、AWS CloudFormation コンソールでスタックに移動します。 出力 タブをクリックして、次のパラメータの値をコピーします。
    • KinesisStreamCreateResourcePolicyCommand
    • KinesisStreamEFOConsumerCreateResourcePolicyCommand
  2. 次の AWS CLI コマンドをアカウント 1 で実行します。 AWS クラウドシェル。 CloudShell には最新バージョンの AWS CLI が含まれており、あらゆる種類の障害を回避できるため、CloudShell を使用することをお勧めします。
    • KinesisStreamCreateResourcePolicyCommand – これにより、アカウント 1 に Kinesis Data Stream のリソースポリシーが作成されます。以下はリソース ポリシーのサンプルです。
      {
      "Version": "2012-10-17",
      "Statement": [
      {
      "Sid": "StreamEFOReadStatementID",
      "Effect": "Allow",
      "Principal": {
      "AWS": [
      "arn:aws:iam::<AWS Lambda - Consumer account id>:role/kds-cross-account-stream-consumer-lambda-execution-role"
      ]
      },
      "Action": [
      "kinesis:DescribeStreamSummary",
      "kinesis:ListShards",
      "kinesis:DescribeStream",
      "kinesis:GetRecords",
      "kinesis:GetShardIterator"
      ],
      "Resource": "arn:aws:kinesis:<region id>:<Account 1 - Amazon KDS account id>:stream/kds-cross-account-stream"
      }
      ]
      }

    • KinesisStreamEFOConsumerCreateResourcePolicyCommand – これにより、アカウント 1 の Kinesis データストリームの拡張ファンアウトコンシューマーのリソースポリシーが作成されます。 以下はサンプルリソースポリシーです。
      {
      "Version": "2012-10-17",
      "Statement": [
      {
      "Sid": "ConsumerEFOReadStatementID",
      "Effect": "Allow",
      "Principal": {
      "AWS": [
      " arn:aws:iam::<AWS Lambda - Consumer account id>:role/kds-cross-account-stream-consumer-lambda-execution-role"
      ]
      },
      "Action": [
      "kinesis:DescribeStreamConsumer",
      "kinesis:SubscribeToShard"
      ],
      "Resource": "arn:aws:kinesis:<region id>:<Account 1 - Amazon KDS account id>:stream/kds-cross-account-stream/consumer/kds-cross-account-stream-efo-consumer:1706616477"
      }
      ]
      }

このポリシーには、Kinesis Data Streams コンソールの次の場所からアクセスすることもできます。 強化されたファンアウト, 消費者名, 消費者共有リソースベースのポリシー.

CloudFormation テンプレート 3 を起動する

アカウント 1 で Kinesis データストリームとその拡張ファンアウトコンシューマ用のリソースポリシーを作成したので、アカウント 2 でコンシューマ Lambda 関数の Lambda イベントソースマッピングを作成できます。 次の手順を実行します。

  1. アカウント 2 としてコンソールにサインインし、適切なリージョンを選択します。
  2. ダウンロードして起動 CloudFormation テンプレート 3 CloudFormation テンプレート 2 を使用して作成したスタックを更新します。

CloudFormation テンプレートは、Lambda イベント ソース マッピングを作成します。

ソリューションを検証する

この時点で、展開は完了です。 Kinesis データストリームはメッセージを消費するために使用でき、Lambda 関数は宛先アカウントでこれらのメッセージを受信します。アカウント 1 のデータ ストリームにサンプル メッセージを送信するには、CloudShell を使用して次の AWS CLI コマンドを実行します。

aws kinesis put-record --stream-name kds-cross-account-stream --data sampledatarecord --partition-key samplepartitionkey3 --region <region id>

アカウント 2 の Lambda 関数はメッセージを受信でき、次を使用して同じことを確認できるはずです。 アマゾンクラウドウォッチ ログ:

  1. CloudWatch コンソールで、 ロググループ ナビゲーションペインに表示されます。
  2. ロググループを見つけます /aws/lambda/kds-cross-account-stream-efo-consumer.
  3. 選択する ロググループの検索 関連するログ メッセージを表示します。以下はメッセージの例です。
    "Records": [
    {
    "kinesis": {
    "kinesisSchemaVersion": "1.0",
    "partitionKey": "samplepartitionkey3",
    "sequenceNumber": "49648798411111169765201534322676841348246990356337393698",
    "data": "sampledatarecord",
    "approximateArrivalTimestamp": 1706623274.658
    },

クリーンアップ

追加コストを避けるために、この投稿の一部として作成したすべてのリソースをクリーンアップすることを常にお勧めします。

リソースをクリーンアップするには、アカウント 1 と 2 からそれぞれの CloudFormation スタックを削除し、プロデューサーが Kinesis データ ストリームにイベントをプッシュするのを停止します。これにより、不必要な料金が請求されることがなくなります。

まとめ

この投稿では、AWS リソースベースのポリシーを使用して、クロスアカウント Lambda と Kinesis Data Streams の統合を設定する方法を説明しました。これにより、ある AWS アカウント内のストリームに取り込まれたデータを、別のアカウントにある Lambda 関数を通じて処理できるようになります。中央アカウントで Kinesis データストリームを使用し、複数のコンシューマーがそこからデータを読み取る顧客をサポートするために、Kinesis Data Streams の拡張ファンアウト機能を使用しました。

開始するには、Kinesis Data Streams コンソールを開くか、新しい API を使用します。 PutResourceポリシー リソース ポリシーをデータ ストリームまたはコンシューマにアタッチします。


著者について

プラティック・パテル シニア テクニカル アカウント マネージャーであり、ストリーミング分析のスペシャリストです。 彼は AWS の顧客と協力し、ベストプラクティスを使用したソリューションの計画と構築を支援し、顧客の AWS 環境を積極的に健全な運用状態に保つための継続的なサポートと技術ガイダンスを提供しています。

英国の Amazon AWS のシニア ソリューション アーキテクトです。彼は電力、公益事業、製造、自動車の顧客全体で戦略的実装に取り​​組んでおり、最適なビジネス成果を推進するために AWS ストリーミングと高度なデータ分析ソリューションの使用を専門としています。

スポット画像

最新のインテリジェンス

スポット画像