Aurora Serverless에 AWS Lambda의 Python에서 Data API로 여러 가지를 시도해 보았습니다.

이 is 뭐



도쿄 리전의 Aurora Serverless에서 Data API(HTTP 엔드포인트)를 사용할 수 있게 된 것의 일본어 정보가 적어서 고생했기 때문에 메모.

저자가 Python 약한 문제



AWS Lambda를 위해 필요하게 달려 쓰기 시작했을 뿐이므로 코드적으로 이케하지 않는 곳이 많다고 생각합니다.
이런 것이 좋다면 꼭 가르쳐 주셨으면합니다

Lambda의 Boto3 오래된 문제



Layers로 해결
$ mkdir python
$ pip install -t ./python boto3
$ zip -r boto3-x.y.z.zip python

가능한 ZIP을 Layers에 등록, Lambda에서 Layer를 선택하면 import boto3 Layer의 boto3을 사용합니다.

Lambda가 사용하는 IAM에 추가로 부여해야 하는 권한


  • secretsmanager:GetSecretValue
  • rds-data:ExecuteStatement
  • rds-data:BeginTransaction ※
  • rds-data:CommitTransaction ※
  • rds-data:RollbackTransaction ※

  • ※ 거래를 사용하지 않는 경우에는 불필요

    테이블


    CREATE TABLE `test` (
      `id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `str` varchar(255) NOT NULL,
      `date` timestamp NOT NULL,
      `val` int)
    

    파이썬 코드



    ※ 실제 코드에서 유용한 부분을 발췌했기 때문에 이대로 움직이는 것이 아니므로주의하십시오.
    import boto3
    
    def lambda_handler(event, context):
        cluster_arn = 'arn:aws:rds:ap-northeast-1:xxxxxxxxxxxx:cluster:yyyyyyyyyyyy'
        secret_arn = 'arn:aws:secretsmanager:ap-northeast-1:xxxxxxxxxxxx:secret:zzzzzzzzzzzz'
    
        rds_data_client = boto3.client('rds-data')
    
        try:
            transaction = rds_data_client.begin_transaction(
                resourceArn = cluster_arn,
                secretArn = secret_arn,
                database = 'dbname'
            )
    
            # ここらへんでdictに色々詰めてる感じ
            # dict['date']にはUNIX時間(秒)が入ってると思ってください
    
            rds_data_client.execute_statement(
                resourceArn = cluster_arn,
                secretArn = secret_arn,
                database = 'dbname',
                transactionId = transaction['transactionId'],
                sql = 'insert into test(str, date, val) values (:str, from_unixtime(:date), :val);',
                parameters = [
                    {'name': 'str', 'value': {'stringValue': dict['str']}},
                    {'name': 'date', 'value': {'longValue': dict['date']}},
                    {'name': 'val', 'value': {'longValue': dict['value']} if dict['val'] else {'isNull': True}},
                ]
            )
    
            rds_data_client.commit_transaction(
                resourceArn = cluster_arn,
                secretArn = secret_arn,
                transactionId = transaction['transactionId']
            )
    
        except Exception:
            rds_data_client.rollback_transaction(
                resourceArn = cluster_arn,
                secretArn = secret_arn,
                transactionId = transaction['transactionId']
            )
    

    좋은 웹페이지 즐겨찾기