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ファイルアップロードを利用する。
関数コード(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パッケージ構成の参考
最近、肩コリが激しくてツラい。(・ω・ )
Deprecated: Function get_magic_quotes_gpc() is deprecated in /virtual/rizworks/public_html/mashpote.net/wp-includes/formatting.php on line 4803
Deprecated: Function get_magic_quotes_gpc() is deprecated in /virtual/rizworks/public_html/mashpote.net/wp-includes/formatting.php on line 4803
Deprecated: Function get_magic_quotes_gpc() is deprecated in /virtual/rizworks/public_html/mashpote.net/wp-includes/formatting.php on line 4803