チュートリアル: Amazon VPC の Amazon RDS にアクセスする Lambda 関数の設定 - AWS Lambda

チュートリアル: Amazon VPC の Amazon RDS にアクセスする Lambda 関数の設定

このチュートリアルでは、以下の作業を行います。

  • デフォルトの Amazon VPC で、Amazon RDS MySQL データベースエンジンのインスタンスを起動します。この MySQL インスタンスで、サンプルテーブル (Employee) を含むデータベース (ExampleDB) を作成します。Amazon RDS の詳細については、Amazon RDS を参照してください。

  • ExampleDB データベースにアクセスし、テーブル (Employee) を作成し、少数のレコードを追加し、テーブルからレコードを取得するための Lambda 関数を作成します。

  • Lambda 関数を呼び出し、クエリの結果を確認します。これは、VPC の RDS MySQL インスタンスに Lambda 関数がアクセスできたことを確認する方法です。

Amazon VPC で Lambda を使用する方法の詳細については、VPC 内のリソースにアクセスするように Lambda 関数を設定する を参照してください。

Prerequisites

このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。初めての方は、Lambda の開始方法 の手順に従って最初の Lambda 関数を作成してください。

次のステップを完了するには、コマンドを実行するコマンドラインターミナルまたはシェルが必要です。コマンドと予想される出力は、別々のブロックにリストされます。

aws --version

次のような出力が表示されます。

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

コマンドが長い場合、コマンドを複数行に分割するためにエスケープ文字 (\) が使用されます。

Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。Windows 10 では、Linux 用の Windows サブシステムをインストールして、Windows 統合バージョンの Ubuntu および Bash を入手できます。

実行ロールを作成する

AWS リソースにアクセスするためのアクセス権限を関数に付与する実行ロールを作成します。

実行ロールを作成するには

  1. IAM コンソールの [roles page (ロールページ)] を開きます。

  2. [ロールの作成] を選択します。

  3. 次のプロパティでロールを作成します。

    • 信頼されたエンティティ – Lambda

    • アクセス許可 - AWSLambdaVPCAccessExecutionRole

    • ロール名 - lambda-vpc-role

AWSLambdaVPCAccessExecutionRole には、VPC へのネットワーク接続を管理するために関数が必要とするアクセス許可があります。

Amazon RDS データベースインスタンスの作成

このチュートリアルでは、サンプルの Lambda 関数でテーブル (Employee) を作成し、少数のレコードを挿入して、そのレコードを取得します。Lambda 関数で作成されるテーブルのスキーマは、次のとおりです。

Employee(EmpID, Name)

EmpID はプライマリキーです。ここで、このテーブルに少数のレコードを追加する必要があります。

まず、デフォルトの VPC で ExampleDB データベースを指定して RDS MySQL インスタンスを起動します。デフォルトの VPC で既に RDS MySQL インスタンスが実行中であれば、この手順をスキップしてください。

RDS MySQL インスタンスは、次のいずれかの方法を使用して起動できます。

データベース名、ユーザー名、およびパスワードをメモします。DB インスタンスのホストアドレス (エンドポイント) も必要です。この情報は、RDS コンソールから取得できます。インスタンスのステータスが使用可能になり、エンドポイント値がコンソールに表示されるまで、待つ必要があります。

デプロイパッケージを作成する

次の例の Python コードでは、VPC に作成した MySQL RDSインスタンスの Employee テーブルに対して SELECT クエリを実行します。コードでは ExampleDB データベースにテーブルを作成し、サンプルレコードを追加して、これらのレコードを取得します。

データベースの認証情報を処理する次の方法は、説明のみを目的としています。実稼働環境では、環境変数の代わりに AWS Secrets Manager を使用してデータベースの認証情報を保存することが推奨されます。詳細については、Lambda 関数のデータベースアクセスの設定を参照してください。

例 app.py

import sys import logging import rds_config import pymysql #rds settings rds_host = "rds-instance-endpoint" name = rds_config.db_username password = rds_config.db_password db_name = rds_config.db_name logger = logging.getLogger() logger.setLevel(logging.INFO) try: conn = pymysql.connect(host=rds_host, user=name, passwd=password, db=db_name, connect_timeout=5) except pymysql.MySQLError as e: logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.") logger.error(e) sys.exit() logger.info("SUCCESS: Connection to RDS MySQL instance succeeded") def handler(event, context): """ This function fetches content from MySQL RDS instance """ item_count = 0 with conn.cursor() as cur: cur.execute("create table Employee ( EmpID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (EmpID))") cur.execute('insert into Employee (EmpID, Name) values(1, "Joe")') cur.execute('insert into Employee (EmpID, Name) values(2, "Bob")') cur.execute('insert into Employee (EmpID, Name) values(3, "Mary")') conn.commit() cur.execute("select * from Employee") for row in cur: item_count += 1 logger.info(row) #print(row) conn.commit() return "Added %d items from RDS MySQL table" %(item_count)

ハンドラの外部で pymysql.connect() を実行すると、関数がデータベース接続を再利用できるようになるため、パフォーマンスが向上します。

2 番目のファイルには、関数の接続情報が含まれています。

例 rds_config.py

#config file containing credentials for RDS MySQL instance db_username = "username" db_password = "password" db_name = "ExampleDB"

デプロイパッケージは、Lambda 関数のコードと依存関係とを含む .zip ファイルです。サンプル関数コードには、以下の依存関係があります。

Dependencies

  • pymysql - Lambda 関数のコードでは、MySQL インスタンスにアクセスするためにこのライブラリが使用されます (PyMySQL を参照)。

デプロイパッケージを作成するには

Lambda 関数を作成する

create-function コマンドを使用して Lambda 関数を作成します。デフォルト VPC 用のサブネット ID やセキュリティグループ ID は、Amazon VPC コンソールで見つけることができます。

aws lambda create-function --function-name CreateTableAddRecordsAndRead --runtime python3.8 \ --zip-file fileb://app.zip --handler app.handler \ --role arn:aws:iam::123456789012:role/lambda-vpc-role \ --vpc-config SubnetIds=subnet-0532bb6758ce7c71f,subnet-d6b7fda068036e11f,SecurityGroupIds=sg-0897d5f549934c2fb

Lambda 関数をテストする

このステップでは、invoke コマンドを使用して Lambda 関数を手動で呼び出します。Lambda 関数が実行されると、RDS MySQL インスタンスの Employee テーブルに対して SELECT クエリが実行され、結果が出力されます (CloudWatch Logs にも送られます)。

  1. invoke コマンドを使用して Lambda 関数を呼び出します。

    aws lambda invoke --function-name CreateTableAddRecordsAndRead output.txt
  2. Lambda 関数が正常に実行されたことを、次のように確認します。

    • output.txt ファイルを確認します。

    • AWS Lambda コンソールで結果を確認します。

    • CloudWatch Logs で結果を確認します。

これで、VPC 内のデータベースにアクセスする Lambda 関数が作成され、イベントへの応答として、この関数を呼び出せるようになりました。イベントソースの設定と例については、「」を参照してください他のサービスで AWS Lambda を使用する

リソースのクリーンアップ

このチュートリアル用に作成したリソースは、保持を希望しない場合、すぐに削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウントに請求される料金が発生しないようにできます。

Lambda 関数を削除するには

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. 作成した関数を選択します。

  3. [アクション] を選択してから、[削除] をクリックします。

  4. [削除] を選択します。

実行ロールを削除するには

  1. IAM コンソールの [Roles (ロール)] ページを開きます。

  2. 作成した実行ロールを選択します。

  3. [ロールの削除] を選択します。

  4. [はい、削除します] を選択します。

MySQL DB インスタンスを削除するには

  1. Amazon RDS コンソールの [Databases] (データベース) ページを開きます。

  2. 作成したデータベースを選択します。

  3. [ Actions] で、[Delete ] を選択します。

  4. [Create final snapshot] (最終スナップショットの作成) のチェックボックスをオフにします。

  5. テキストボックスに「delete me」と入力します。

  6. [削除] を選択します。