AWS LambdaでEC2上のMySQLへ接続する

Lambda上のスクリプトからEC2上のリレーショナルDBへアクセスしたい。
とりあえずMySQL。
ググってみたけど、みんなRDSばっかり。
ひょっとしてできないのか?それとも世の中的に需要がないのか・・・。
まあ固定のRDBに接続するって事はLambdaのスケールメリットが失われる事になるわけだから、需要がないのもうなずける。

結論からいうと、Lambdaからの接続は”可能”。

基本的な考え方としては
LambdaをVPC上で実行。そのVPCからのMySQL接続をEC2で許可してやればDB接続ができる。

VPCまわりの設定

MySQLのあるEC2に設定されているセキュリティグループの設定で対象のRDBのポート、MySQLならデフォルト3306を追加する。VPCのネットワークACLの設定でも同様にポートが許可されていることを確認しておく。※通常はすべて許可されているはず

Lambda関数を作成し、関数コードの下にある「ネットワークの設定」においてVPCおよびサブネットを設定していく。
また、「実行ロール」に設定されているロールに対してAWSLambdaVPCAccessExecutionRoleポリシーを割り当てる。

「高可用性モードで実行するにはサブネットが2つ必要」とかいうエラーが出るけど1つしか設定していなくても動く。
エラーを消したい場合は、VPCからサブネットを作成して要求を満たしてあげよう。

サブネットの追加(オプション)

サブネットを作成する+そのサブネット上のEC2から接続テストを行いたい場合は
サブネットを追加し、外部から接続できるようにパブリックIPを割り当て可能にしよう。
VPCを選択して、アクション>自動割り当て IP 設定の変更を行う。
そして、ルートテーブルを1つめのサブネットが利用しているものと同じものを指定してやる。
これでこのVPC上に起動するEC2はHTTPやSSHなどで外部から接続できるようになる。
ただし、セキュリティ上の理由からDMZは無暗に増やすべきではない(笑)

作成したサブネット上からEC2上のMySQLへの接続ができる事がわかったら
いよいよLambdaから接続してみる。

LambdaスクリプトからDB接続実行

今回は試しにPythonスクリプトで実行。
MySQLへ接続するために、mysql-connector-pythonをパッケージングしてやる必要がある。
そのため、ローカルで次のコマンドを実行し、lambda_function.pyと合わせてZip化、Zipファイルアップロードを利用する。
pip install mysql-connector-python -t .

関数コード(lambda_function.py)

import json
import mysql.connector
import traceback
import sys

def lambda_handler(event, context):
    
    image_name = ""
    details = ""
    
    conn = mysql.connector.connect(user='[DBユーザー]', password='[パスワード]', host='[サブネット上の内部IPアドレス]', database='[DB名]')
    cur = None
    try:
        cur = conn.cursor(dictionary=True)
        cur.execute("select * from test;")
        for row in cur.fetchall():
            details += row['hoge'] + ","  # testテーブル上のhogeカラムの値を取得
        cur.close
    except:
        traceback.print_exc()
        print(sys.exc_info())
        details = "error!"   
    finally:
        cur.close
        conn.close       
    return {
        'statusCode': 200,
        'body': json.dumps('Hello : ' + details)
    }

※DBホストのIPアドレスはパブリックIPではなくプライベートIPを指定する。

関数を保存して、Lambdaコンソール上からテスト実行すればExecution Resultにテーブルの内容が表示されるはず~。

pythonパッケージ構成の参考

最近、肩コリが激しくてツラい。(・ω・ )

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です