チュートリアル: 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 関数の設定」を参照してください。

前提条件

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

このガイドの手順に従うには、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要になります。コマンドは、該当する場合、プロンプト記号 ($) と現在のディレクトリの名前が前に付けられて、リストに示されます。

~/lambda-project$ this is a command this is output

コマンドが長い場合は、エスケープ文字 (\) を使用して、コマンドを複数の行に分割します。

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

実行ロールを作成する

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

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

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

  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(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"

依存関係

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

Pip で依存関係をインストールし、デプロイパッケージを作成します。手順については、「Python の AWS Lambda デプロイパッケージ」を参照してください。

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. [ Actions] で、[Delete ] を選択します。

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

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

  1. IAM コンソールのロールページを開きます。

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

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

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

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

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

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

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

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

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

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