import json import os from datetime import datetime import boto3 # 環境変数 SFN_STATE_MACHINE_ARN=os.environ["SFN_STATE_MACHINE_ARN"] CLUSTER_NAME = os.environ["CLUSTER_NAME"] TASK_NAME = os.environ["TASK_NAME"] CONTAINER_NAME = os.environ["CONTAINER_NAME"] SUBNET_ID_AP_NORTHEAST_1A = os.environ["SUBNET_ID_AP_NORTHEAST_1A"] SUBNET_ID_AP_NORTHEAST_1D = os.environ["SUBNET_ID_AP_NORTHEAST_1D"] SECURITY_GROUP_ID_ECSALL = os.environ["SECURITY_GROUP_ID_ECSALL"] SECURITY_GROUP_ID_ECSDATAIMPORT = os.environ["SECURITY_GROUP_ID_ECSDATAIMPORT"] MODE = os.environ["MODE"] # クラス変数 ecs_client = boto3.client('ecs') sfn_client = boto3.client('stepfunctions') def lambda_handler(event, context): print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Info I-1 駆動処理開始') # イベント情報を取得する s3_event = event["Records"][0]["s3"] event_bucket_name = s3_event["bucket"]["name"] event_object_key = s3_event["object"]["key"] event_file_name = os.path.basename(event_object_key) event_data_source_name = os.path.dirname(event_object_key).split('/')[0] print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Info I-2 バケット名:{event_bucket_name}') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Info I-3 ファイル名:{event_file_name}') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Info I-4 データソース名:{event_data_source_name}') # StepFunctionsを起動する response = sfn_client.start_execution( stateMachineArn=SFN_STATE_MACHINE_ARN, input=json.dumps( { 'inputParams': { 'ecs': { 'Cluster': CLUSTER_NAME, 'TaskDefinition': TASK_NAME, 'network': { # TODO: 配列もパラメータから組めるなら、StepFunctions側で組み立てる "Subnets": [ SUBNET_ID_AP_NORTHEAST_1A, SUBNET_ID_AP_NORTHEAST_1D, ], "SecurityGroups": [ SECURITY_GROUP_ID_ECSALL, SECURITY_GROUP_ID_ECSDATAIMPORT, ], }, 'overrides': { "ContainerName": CONTAINER_NAME, "Environment": [ # TODO: 環境変数以外でも使いたいので、外出しする {"Name": 'BUCKET_NAME', "Value": event_bucket_name}, {"Name": 'TARGET_KEY', "Value": event_object_key}, {"Name": 'DATA_SOURCE_NAME', "Value": event_data_source_name}, {"Name": 'FILE_NAME', "Value": event_file_name}, {"Name": 'MODE', "Value": MODE}, ], }, }, } } ) ) # # ECSを起動する # response = ecs_client.run_task( # launchType='FARGATE', # cluster=CLUSTER_NAME, # taskDefinition=TASK_NAME, # networkConfiguration={ # "awsvpcConfiguration": { # "subnets": [ # SUBNET_ID_AP_NORTHEAST_1A, # SUBNET_ID_AP_NORTHEAST_1D, # ], # "securityGroups": [ # SECURITY_GROUP_ID_ECSALL, # SECURITY_GROUP_ID_ECSDATAIMPORT, # ], # } # }, # overrides={ # "containerOverrides": [ # { # "name": CONTAINER_NAME, # "environment": [ # {"name": 'BUCKET_NAME', "value": event_bucket_name}, # {"name": 'TARGET_KEY', "value": event_object_key}, # {"name": 'DATA_SOURCE_NAME', "value": event_data_source_name}, # {"name": 'FILE_NAME', "value": event_file_name}, # {"name": 'MODE', "value": MODE}, # ], # }, # ], # }, # ) # TODO: コメントと設計修正 print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Info I-5 ECS起動レスポンス:{str(response)}') print(f'{datetime.now():%Y-%m-%d %H:%M:%S} Info I-6 駆動処理終了') if __name__ == '__main__': # ローカル実行用 lambda_handler({"Records": [{ "s3": { "bucket": { "name": "test-shimoda-bucket" }, "object": { "key": "folder/object_key" } } }]}, {})