構造解析ソフトFrontISTRをクラウドAWSで動かす~S3 バケットからlambda関数編~
シリーズ目次
- 構造解析ソフトFrontISTRをクラウドAWSで動かす~システムの構成編~
- 構造解析ソフトFrontISTRをクラウドAWSで動かす~S3 バケットからlambda関数編~
- 構造解析ソフトFrontISTRをクラウドAWSで動かす~ECS(Dockerイメージ)作成編~
- 構造解析ソフトFrontISTRをクラウドAWSで動かす~テストそして成功!!編~
今回の概要
構造解析ソフト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_CLUSTERとTASK_DEFINITIONは、後述する
lambdaコード
lambda関数のコードは以下のようにします
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