AWS Fargate を使用して、イベント駆動型およびスケジュールされたワークロードを大規模に実行 - AWS Prescriptive Guidance

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Fargate を使用して、イベント駆動型およびスケジュールされたワークロードを大規模に実行

ハリ・オーム・プラサート・ラジャゴパル(AWS)によって作成

[環境]: PoC またはパイロット

Technologies: モダナイゼーション、サーバーレス、運用

ワークロードに追加します。オープンソースの

AWS のサービス: AWS EC2 Container Registry; Amazon ECS; AWS CodeCommit; AWS Fargate; AWS Lambda; Amazon SNS

Summary

このパターンでは、AWS Fargate を使用して、Amazon Web Services (AWS) クラウドでスケジュールされたワークロードとイベントドリブンのワークロードを大規模に実行する方法について説明します。

このパターンが設定するユースケースでは、プルリクエストが送信されるたびに、AWS アカウント番号や認証情報などの AWS 機密情報をコードがスキャンされます。プルリクエストは Lambda 関数を開始します。Lambda 関数は、コードスキャンを処理する Fargate タスクを呼び出します。Lambda は、新しいプルリクエストが発生するたびに開始されます。スキャンで機密情報が見つかった場合、Amazon Simple Notification Service (Amazon SNS) は、スキャン結果を E メールメッセージで送信します。

このパターンは次のビジネスユースケースに役立ちます。

  • ランタイム(15 分の制限)またはメモリに関する制限のために AWS Lambda では実行できない、スケジュールされたイベント駆動型のワークロードをビジネスで実行する必要がある場合

  • これらのワークロード用にプロビジョニングされたインスタンスを AWS で管理する場合

このパターンを使用する場合は、新しい仮想プライベートクラウド (VPC) を作成するオプションがあります。

前提条件と制限

前提条件

  • アクティブ AWS アカウント

  • コードベースをホストし、プルリクエストを作成するための AWS CodeCommit

  • macOS、Linux、または Windows にインストールして設定した AWS コマンドラインインターフェイス (AWS CLI) バージョン 1.7 以降

  • コンテナーで実行されるワークロード

  • クラスパスでApache Maven実行可能ファイルをセットアップする

Architecture

フロー全体には、次のステップが含まれます。

  1. CodeCommit で新しいプル要求が送信されるたびに、Lambda 関数が開始されます。Lambda 関数は、CodeCommit Pull Request State ChangeイベントをAmazon EventBridge経由で送信します。

  2. Lambda 関数は、コードをチェックアウトしてスキャンするための以下の環境パラメータを持つ新しい Fargate タスクを送信します。

    RUNNER → <<TaskARN>> SNS_TOPIC → <<SNSTopicARN>> SUBNET → <<Subnet in which Fargate task gets launched>>

    スキャンでコードで機密情報が見つかった場合、Fargate は新しいメッセージを Amazon SNS トピックにプッシュします。

  3. SNS サブスクライバは、トピックからメッセージを読み取り、電子メールメッセージを送信します。

テクノロジー

  • AWS CodeCommit

  • Amazon Elastic Container Registry (Amazon ECR)

  • Amazon Elastic Container Service (Amazon ECS)

  • Amazon EventBridge

  • AWS Fargate

  • AWS Lambda

  • Amazon SNS

  • Docker

Tools

ツール

  • AWS CLI— AWS コマンドラインインターフェイス (CLI) は、AWS のサービスを管理するための統合ツールです。

  • AWS CodeCommit— AWS CodeCommit は、セキュアな Git ベースのリポジトリをホストする、完全マネージド型のソース管理サービスです。CodeCommit を使用すると、チームは安全で拡張性の高い環境でコードを共同作業できます。

  • Amazon ECR— Amazon Elastic Container Registry (Amazon ECR) は、開発者が Docker コンテナイメージを保存、管理、デプロイするために使用できる完全マネージド型レジストリです。

  • Amazon ECS— Amazon Elastic Container Service (Amazon ECS) は、高度にスケーラブルで高速なコンテナ管理サービスです。Amazon ECS を使用して、クラスター上のコンテナを実行、停止、管理できます。

  • /AWS Fargate— AWS Fargate は、Amazon ECS とともに使用して Amazon EC2 インスタンスでサーバーまたはクラスターを管理する必要なくコンテナを実行できるテクノロジーです。

  • AWS Lambda— AWS Lambda は、サーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。AWS Lambda は必要に応じてコードを実行し、1 日あたり数個から 1 秒あたり数千のリクエストまで自動的にスケーリングします。

  • Amazon SNS— Amazon Simple Notification Service (Amazon SNS) は、パブリッシャーからサブスクライバー (プロデューサーやコンシューマーとも呼ばれます) へのメッセージ配信を提供するマネージド型サービスです。パブリッシャは、論理アクセスポイントおよび通信チャネルであるトピックにメッセージを送信することで、サブスクライバと非同期的に通信します。SNS トピックをサブスクライブするクライアントは、Lambda、Eメール、モバイルプッシュ通知、モバイルテキストメッセージ(SMS)など、サポートされているプロトコルを使用して公開メッセージを受信します。

  • Docker— Docker は、コンテナーと呼ばれるパッケージでアプリケーションを構築、テスト、配信するのに役立ちます。

  • Git クライアント— 必要なアーティファクトをチェックアウトするコマンドラインまたはデスクトップツール

  • Maven— Apache Maven は、プロジェクトのビルド、レポート、ドキュメントを一元管理するためのプロジェクト管理ツールです。

Epics

タスク説明必要なスキル
コードをダウンロードします。

添付ファイルセクションで.zip ファイルをダウンロードし、ファイルを展開します。

開発者、AWS システム管理者
リポジトリを設定します。

Runmvn clean installのルートフォルダに。

開発者、AWS システム管理者
タスク説明必要なスキル
Amazon ECR リポジトリを作成し、ログインします。

Amazon ECR コンソールを開きます。ナビゲーションペインで、[]、[] の順に選択します。リポジトリを選択してから、[] を選択します。リポジトリの作成。このストーリーやその他のストーリーに関するヘルプについては、関連リソースセクションに追加します。

開発者、AWS システム管理者
コンテナイメージをプッシュします。

リポジトリを開き、[] を選択します。プッシュコマンドの表示に移動し、Dockerにログインします。ログイン後、必要な代替コマンドとともにコマンドを実行します。これらのコマンドはコンテナーのイメージをプッシュします。追加情報セクションに追加します。これにより、コードスキャンの実行に使用されるDockerコンテナイメージがアップロードされます。アップロードが完了したら、最新のビルドの URL を Amazon ECR リポジトリにコピーします。

開発者、AWS システム管理者
タスク説明必要なスキル
CodeCommit リポジトリを作成します。

新しい AWS CodeCommit リポジトリを作成するには、[] コマンドを実行します。新しい CodeCommit リポジトリを作成します。追加情報セクションに追加します。

開発者、AWS システム管理者
タスク説明必要なスキル
VPC を作成します。

既存の VPC ではなく新しい VPC を使用する場合は、VPC を作成する追加情報セクションに追加します。AWS Cloud Development Kit (AWS CDK) スクリプトは、作成された VPC とサブネットの ID を出力します。

開発者、AWS システム管理者
タスク説明必要なスキル
クラスターとタスクを作成します。

Amazon ECS クラスターと Fargate タスク定義を作成するには、クラスターとタスクの作成追加情報セクションに追加します。シェルスクリプトの実行中に、正しい VPC ID と Amazon ECR レポ URI がパラメータとして渡されていることを確認します。スクリプトは、Dockerイメージ(スキャンを担当する)を指すFargate タスク定義を作成します。スクリプトは、ジョブと関連する実行ロールを作成します。

開発者、AWS システム管理者
Amazon ECS クラスターを確認します。

Amazon ECS コンソールを開きます。ナビゲーションペインで、[]、[] の順に選択します。クラスターを選択し、新しく作成した Amazon ECS クラスターをファーゲート-ジョブ-クラスター。この後、タスク定義] をクリックし、新しいタスク定義にプレフィックスawscdkfargateecsTaskDef

開発者、AWS システム管理者
タスク説明必要なスキル
SNS トピックを作成します。

SNS トピックを作成するには、[] コマンドを実行します。SNS トピックを作成する追加情報セクションに追加します。作成が成功したら、SNS ARNこれは次のステップで使用します。

開発者、AWS システム管理者
SNS サブスクライバーを作成します。

SNS トピックの電子メールサブスクライバーを作成するには、SNS サブスクライバーの作成追加情報セクションに追加します。次に置き換えてください。TopicARNおよびEmail addressCLI コマンドで使用します。電子メール通知を受信するには、サブスクライバとして使用されている電子メールアドレスを確認してください。

開発者、AWS システム管理者
タスク説明必要なスキル
関数とトリガーを作成します。

CodeCommit トリガーを使用して Lambda 関数を作成するには、[] コマンドを実行します。Lambda 関数と CodeCommit トリガー追加情報セクションに追加します。コマンドを実行する前に、パラメータを対応する値に置き換えてください。このスクリプトは Lambda 関数を作成し、新しいプル要求が行われたときに呼び出されるように設定します。

開発者、AWS システム管理者
タスク説明必要なスキル
アプリケーションをテストします。

AWS の機密情報を CodeCommit リポジトリにチェックインする場合は、Lambda 関数を開始する必要があります。Lambda 関数は、コードをスキャンし、スキャン結果を電子メール通知で送信する Fargate タスクを開始します。

開発者、AWS システム管理者

追加情報

コンテナーのイメージをプッシュします。

> cd 1-ecr-image-push > ./run.sh <<ecr-repository>>

新しい CodeCommit リポジトリを作成します。

aws codecommit create-repository --repository-name test-repo --repository-description "My Test repository"

VPC を作成する

> cd 2-create-vpc > ./run.sh

出力

aws-batch-cdk-vpc-efs-launch-template.privatesubnet = subnet-<<id>> aws-batch-cdk-vpc-efs-launch-template.publicsubnet = subnet-<<id>> aws-batch-cdk-vpc-efs-launch-template.vpcid = vpc-<<id>>

クラスターとタスクの作成

> export CDK_DEFAULT_ACCOUNT = <<aws_account_id>> > export CDK_DEFAULT_REGION = <<aws_region>> > cd 3-create-ecs-task > ./run.sh <<vpc-id>> <<ecr-repo-uri>>

出力

aws-cdk-fargate-ecs.CLUSTERNAME = Fargate-Job-Cluster aws-cdk-fargate-ecs.ClusterARN = <<cluster_arn>> aws-cdk-fargate-ecs.ContainerARN = Fargate-Container aws-cdk-fargate-ecs.TaskARN = <<task_arn>> aws-cdk-fargate-ecs.TaskExecutionRole = <<execution_role_arn>> aws-cdk-fargate-ecs.TaskRole = <<task_role_arn>>

SNS トピックを作成する

aws sns create-topic --name code-commit-topic

SNS サブスクライバーの作成

aws sns subscribe \     --topic-arn <<topic_arn>> \     --protocol email \     --notification-endpoint <<email_address>>

Lambda 関数と CodeCommit トリガー

> export CDK_DEFAULT_ACCOUNT = <<aws_account_id>> > export CDK_DEFAULT_REGION = <<aws_region>> > cd 5-Lambda-CodeCommit-Trigger > ./run.sh <<taskarn>> <<snstopicarn>> subnet-<<id>> <<codecommitarn>>

出力

aws-cdk-fargate-lambda-event.Cloudwatchrule = <<cloudwatchrule>> aws-cdk-fargate-lambda-event.CodeCommitLambda = AWS-Code-Scanner-Function aws-cdk-fargate-lambda-event.LambdaRole = <<lambdaiamrole>>

Attachments

attachment.zip