import json import botocore import boto3 import api_common from aws_lambda_powertools import Logger, Tracer from aws_lambda_powertools.utilities.typing import LambdaContext # ãƒã‚°ã¨ãƒˆãƒ¬ãƒ¼ã‚¹ã®æ©Ÿèƒ½ã‚’åˆæœŸåŒ– logger = Logger() tracer = Tracer() # AWS サービスã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚’åˆæœŸåŒ– omics = boto3.client('omics') # ワークフãƒãƒ¼ã®å®Ÿè¡ŒçŠ¶æ…‹ã‚’扱ㆠAPI を実装ã—㟠Lambda 関数ã®ãƒãƒ³ãƒ‰ãƒ© # CloudWatch Logs 㨠X-Ray ã«ã‚ˆã‚‹ãƒã‚°ã¨ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’有効化 @tracer.capture_lambda_handler @logger.inject_lambda_context(log_event=True) def handler(event: dict, context: LambdaContext) -> dict: # REST API ã«æŒ‡å®šã•ã‚ŒãŸãƒ‘スã¨ã‚¯ã‚¨ãƒªæ–‡å—列をå–å¾— pathParams = event.get('pathParameters') or {} if not pathParams: # ãƒ‘ã‚¹æƒ…å ±ãŒãªã‘れ㰠400 Bad Request ã¨ã™ã‚‹ return { 'statusCode': 400, 'headers': api_common.CORS_HEADERS, } runId = pathParams.get('runId') if not runId: # パスã«å®Ÿè¡Œ ID ãŒå«ã¾ã‚Œã¦ã„ãªã‘れ㰠404 Not Found ã¨ã™ã‚‹ return { 'statusCode': 404, 'headers': api_common.CORS_HEADERS, } try: # ワークフãƒãƒ¼ã®å®Ÿè¡Œçµæžœã‚’削除ã™ã‚‹ return handle_delete_run(runId) except botocore.exceptions.ClientError as err: statusCode = err.response['ResponseMetadata']['HTTPStatusCode'] code = err.response['Error']['Code'] message = err.response['Error']['Message'] logger.exception(f'{code}: {message}') # AWS ã® API ã‹ã‚‰ã‚¨ãƒ©ãƒ¼ãƒ¬ã‚¹ãƒãƒ³ã‚¹ãŒè¿”ã•ã‚ŒãŸã‚‰ã€ãã®å†…容ã«æº–ã˜ãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã¨ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’返㙠return { 'statusCode': statusCode, 'headers': { 'Content-Type': 'application/json', **api_common.CORS_HEADERS, }, 'body': json.dumps({ 'code': code, 'message': message, }, default=api_common.default_serializer), } except (botocore.exceptions.BotoCoreError, ValueError) as err: code = type(err).__name__ message = str(err) logger.exception(f'{code}: {message}') # ãã®ä»–ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰ã€ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨å…±ã« 400 Bad Request を返㙠return { 'statusCode': 400, 'headers': { 'Content-Type': 'application/json', **api_common.CORS_HEADERS, }, 'body': json.dumps({ 'code': code, 'message': message, }, default=api_common.default_serializer), } # ワークフãƒãƒ¼ã®å®Ÿè¡Œçµæžœã‚’削除ã™ã‚‹ def handle_delete_run(runId: str) -> dict: # Omics ワークフãƒãƒ¼ã®å®Ÿè¡Œçµæžœã‚’削除ã™ã‚‹ omics.delete_run(id=runId) return { 'statusCode': 202, 'headers': api_common.CORS_HEADERS, }