Amazon Redshift でクエリを実行する AWS Lambda 関数を作成するにはどうすればよいですか?

最終更新日: 2022 年 3 月 11 日

Amazon Redshift でクエリを実行する AWS Lambda 関数を作成しようとしています。これを行うにはどうすればよいですか?

解決方法

前提条件

Lambda 関数を作成する前に、次の VPC エンドポイントをセットアップする必要があります。

1.    プライベートサブネットを持つ VPC を作成します。

2.    サブネットグループを作成します。先ほど作成した VPC を追加します。

3.    先ほど作成した VPC とサブネットグループを選択して、プライベート Amazon Redshift クラスターを作成します。

4.    AWS Secrets Manager で Amazon Redshift の新しいシークレットを作成します。シークレットに「redshift」という名前を付けます。

Lambda 関数を作成する

Amazon Redshift クラスターをクエリする Lambda 関数を作成するには、以下の手順を実行します。

1.    Lambda コンソールを開きます。

2.    [Create function] (関数の作成) を選択します。

3.    [Author from Scratch] (最初から作成) オプションを選択します。

4.    以下のフィールドを更新します。
[Function name] (関数名): カスタム名を入力します。
[Runtime] (ランタイム): コード環境を入力します。(この記事の例は「Python 3.9」と互換性があります。)
[Architecture] (アーキテクチャ): システムアーキテクチャを入力します。(この記事の例は「x86_64」と互換性があります。)
[Permissions] (許可): [Create a new role with basic Lambda permissions] (基本的な Lambda 許可で新しいロールを作成) を選択します。

5.    [Create function] (関数の作成) を選択します。

Lambda 関数に正しい許可を設定する

1.    Lambda コンソールで、[Configuration] (設定) を選択します。

2.    [Permissions] (許可) を選択します。

3.    Lambda 関数用に作成されたロールを選択します。

4.    [Add Permissions] (許可を追加) を選択します。

5.    [Attach policies] (ポリシーをアタッチ) を選択します。

6.    「AmazonRedshiftDataFullAccess」および「SecretsManagerReadWrite」ポリシーを Lambda 実行ロールに追加します。

Python コードを Lambda 関数に追加する

1.    Lambda コンソールで、[Code] (コード) を選択します。

2.    次のコードを [Code] (コード) ボックスに貼り付けます。

import json
import urllib.parse
import boto3
import botocore.session as bc

print('Loading function')

s3 = boto3.client('s3')


def lambda_handler(event, context):
    print("Entered lambda_handler")

    secret_name='redshift' ## HERE add the secret name created.
    session = boto3.session.Session()
    region = session.region_name
    
    client = session.client(
            service_name='secretsmanager',
            region_name=region
        )
    
    get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    secret_arn=get_secret_value_response['ARN']
    
    secret = get_secret_value_response['SecretString']
    
    secret_json = json.loads(secret)
    
    cluster_id=secret_json['dbClusterIdentifier']
    
    
    bc_session = bc.get_session()
    
    session = boto3.Session(
            botocore_session=bc_session,
            region_name=region,
        )
    
    # Setup the client
    client_redshift = session.client("redshift-data")
    print("Data API client successfully loaded")
    
    query_str = "create table public.lambda_func (id int);"
                      
    print(query_str)
    
    res = client_redshift.execute_statement(Database= 'dev', SecretArn= secret_arn, Sql= query_str, ClusterIdentifier= cluster_id)
    id=res["Id"]

注: 「redshift」とは異なる名前のシークレットを作成した場合は、secret_name をシークレット名に置き換えてください。

この例では、Lambda は Amazon Redshift データベースに接続し、パブリックスキーマに lambda_func テーブルを作成します。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?