🐙

構造解析ソフトFrontISTRをクラウドAWSで動かす~S3 バケットからlambda関数編~

2022/02/20に公開

シリーズ目次

今回の概要

構造解析ソフトFrontISTRをクラウドAWSで動かすため
今回はS3バケットに zipファイルをアップロードしてから lambda関数を起動するところまでの解説を行います.

前提条件

AWS のアカウントが必要です。

S3バケットの用意する

AWSコンソールからS3ダッシュボードを表示

S3バケットとは: AWS でファイルをアップロードしたりダウンロードしたりできる記憶領域で、そこにファイルをアップロードしたことを検知していろいろな処理を開始するきっかけをつくることができます。

以下の設定でバケットを2つ作成します。

S3ダッシュボード画面からS3バケットを作成ボタンを押下

バケットは

  • frontistr-bucket-sasaco:アップロード用
  • frontistr-bucket-sasaco-resized:解析結果保存用

という名の2つのバケットを作成します。

バケット名はユニーク名でなければならないので, 上記のバケット名は私が使っているので使えません。別の名前としてください

設定は2つとも同じで以下はfrontistr-bucket-sasacoのバケットの作成画面を示す





作成後のS3ダッシュボード画面

lambda関数を用意する

AWSコンソールからlambdaダッシュボードを表示

lambda関数を作成

lambdaダッシュボード画面から関数の作成ボタンを押下

※1 lambda関数の実行ロールについて

lambda関数の実行ロールは,

  • 基本的な Lambda アクセス権限で新しいロールを作成
  • 既存のロールを使用する
  • AWS ポリシーテンプレートから新しいロールを作成

どれを選択してもいいですが、以下のように設定しました

許可ポリシーAmazonS3FullAccessというのを追加

許可ポリシーに以下のカスタムポリシーを追加

カスタムポリシーを追加

インラインポリシーの追加画面に移動します。

以下の権限をそれぞれ追加します。

  • ecs:RunTask
  • iam:PassRole

lambda関数のトリガーを設定

lambda関数にS3のfrontistr-bucket-sasaco:アップロード用バケットのトリガーを設定します。



作成後のlambdaダッシュボード画面

環境変数に以下の設定を行います。

キー 備考
DESTINATION_BUCKET frontistr-bucket-sasaco-resized S3バケット名(解析結果保存用)
ECS_CLUSTER python-worker-cluster ※2
SUBNET_ID_1 subnet-04****33 ※1
TASK_DEFINITION PythonWorkerTask:1 ※2

※1 サブネットは既存のサブネットを設定する

どれでもいいので、適当なサブネット IDを設定します

※2 この時点ではまだ作成していないサービス名です

ECS_CLUSTERTASK_DEFINITIONは、後述する

lambdaコード

lambda関数のコードは以下のようにします

lambda_function.py
import boto3
import os

ecs_client = boto3.client("ecs")

ECS_CLUSTER = os.environ["ECS_CLUSTER"]
TASK_DEFINITION = os.environ["TASK_DEFINITION"]
DESTINATION_BUCKET = os.environ["DESTINATION_BUCKET"]
SUBNET_ID_1 = os.environ["SUBNET_ID_1"]

def lambda_handler(event, context):
    s3_event = event["Records"][0]["s3"]
    event_bucket = s3_event["bucket"]["name"]
    event_object_key = s3_event["object"]["key"]
    ecs_client.run_task(
        cluster=ECS_CLUSTER,
        launchType="FARGATE",
        networkConfiguration={
            "awsvpcConfiguration": {
                "subnets": [SUBNET_ID_1],
                "assignPublicIp": "ENABLED",
            }
        },
        overrides={
            "containerOverrides": [
                {
                    "name": "python-worker",
                    "environment": [
                        {"name": "EVENT_BUCKET", "value": event_bucket},
                        {"name": "EVENT_OBJECKT_KEY", "value": event_object_key},
                        {"name": "DESTINATION_BUCKET", "value": DESTINATION_BUCKET},
                    ],
                },
            ],
        },
        taskDefinition=TASK_DEFINITION,
    )

やってることは、呼び出されたら上記で設定した環境変数をECSタスクに渡してECSタスクを起動する ということをやっています。

これまでの総括

今回は、S3バケットにアップロードがあったらklambda関数を呼び出すところまで作成しました

次回
ECS Dockerイメージ作成編 に続きます

Discussion