AWS Fargate を使用して、イベント駆動型でスケジュール済みの大規模ワークロードを実行する - AWS 規範ガイダンス

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

AWS Fargate を使用して、イベント駆動型でスケジュール済みの大規模ワークロードを実行する

作成者: HARI OHM PRASATH RAJAGOPAL (AWS)

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

テクノロジー: モダナイゼーション、サーバーレス、オペレーション

ワークロード: オープンソース

AWS サービス: Amazon EC2 Container RegistryAmazon ECS、AWS CodeCommit、AWS Fargate、AWS LambdaAmazon SNS

[概要]

このパターンでは、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アカウント

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

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

  • コンテナでワークロードを実行している

  • クラスパスに Apache Maven 実行ファイルが設定されている

アーキテクチャ

以下のステップが全体のフローに含まれます。

  1. で新しいプルリクエストが送信されるたびに CodeCommit、Lambda 関数が開始されます。Lambda 関数は、Amazon 経由でCodeCommit Pull Request State Changeイベントをリッスンします 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

ツール

ツール

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

  • AWS CodeCommit – AWS CodeCommit は、セキュアな Git ベースのリポジトリをホストするフルマネージド型のソースコントロールサービスです。を使用すると CodeCommit、チームは安全でスケーラブルな環境でコードに共同作業できます。

  • Amazon ECR – Amazon Elastic Container Registry (Amazon ECR) は、フルマネージド型の Docker コンテナレジストリで、Docker コンテナイメージの保存、管理、デプロイを行うことができます。

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

  • AWS Fargate」— AWS Fargate は、Amazon ECS で使用できるテクノロジーであり、サーバーや Amazon EC2 インスタンスのクラスターを管理することなくコンテナを実行できます。

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

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

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

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

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

エピック

タスク説明必要なスキル

コードをダウンロードします。

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

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

リポジトリを設定します。 

ルートフォルダから mvn clean install を実行します。

開発者、AWS システム管理者
タスク説明必要なスキル

Amazon ECR でリポジトリを作成して、ログインします。

Amazon EMR コンソールを開きます。ナビゲーションペインで、[リポジトリ] を選択し、[リポジトリの作成] を選択します。このストーリーやその他のストーリーに関するヘルプは、「関連リソース」セクションを参照してください。

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

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

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

開発者、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 EKS クラスターを検証します。

Amazon ECS コンソールを開きます。ナビゲーションペインで、[クラスター] を選択し、新しく作成した Fargate-Job-Cluster という名前の Amazon ECS クラスターを選択します。その後、ナビゲーションペインで [タスク定義] を選択し、awscdkfargateecsTaskDef プレフィックスの付いた新しいタスク定義があることを確認します。

開発者、AWS システム管理者
タスク説明必要なスキル

SNS トピックを作成します。

SNS トピックを作成するには、[追加情報] セクションの [SNS トピックの作成] にあるコマンドを実行します。作成に成功したら、次の手順で使用する SNS ARN を書き留めます。

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

SNS トピックとサブスクライバーを作成します。

SNS トピックのメールサブスクライバーを作成するには、[追加情報] セクションの [SNS サブスクライバーの作成] にあるコマンドを実行します。CLI コマンドで使用されている TopicARNEmail address は必ず置き換えてください。メール通知を受信するには、サブスクライバーとして使用しているメールアドレスを確認してください。

開発者、AWS システム管理者
タスク説明必要なスキル

関数とトリガーを作成します。

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

開発者、AWS システム管理者
タスク説明必要なスキル

アプリケーションをテストします。

CodeCommit リポジトリに AWS 機密情報をチェックインする場合は、Lambda 関数を開始する必要があります。Lambda 関数は Fargate タスクを開始します。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>>

添付ファイル

このドキュメントに関連する追加コンテンツにアクセスするには、次のファイルを解凍してください。「attachment.zip