モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)
目次目次を開く/閉じる

AWS Lambda 関数から VPC 内の RDS を利用するための設定

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2017/10/14
最終更新最終更新
2020/02/18
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    サーバーレスとDevOpsに注力中。AWSを使った効率的なインフラ構築が得意です。

    0
    ステッカーを贈るとは?

    Lambda 関数が VPC 内のリソースにアクセスするためには create-function 時に --vpc-config でサブネットに所属させる必要があります。リソースの具体例として RDS にアクセスするために必要な設定方法をまとめます。

    RDS の構築

    AmazonRDSFullAccess が付与された IAM を用いて以下の create-db-instance コマンドで RDS インスタンスを作成します。

    aws rds create-db-instance \
    --profile lambda-test-user-20170929 \
    --region ap-northeast-1 \
    --db-instance-identifier mydbinstance \
    --db-instance-class db.t2.micro \
    --engine mysql \
    --engine-version 5.7.17 \
    --allocated-storage 5 \
    --no-publicly-accessible \
    --db-name mydb \
    --master-username mymasteruser \
    --master-user-password mymasteruser \
    --backup-retention-period 3
    

    IAM ロールの作成

    Lambda 関数が必要とする権限が付与された IAM ロールを作成します。

    • ロール名 my-lambda-rds-role
    • AWS service role Lambda
    • ポリシー AWSLambdaVPCAccessExecutionRole

    Lambda 関数の登録

    ここでは Node.js を利用します。MySQL クライアントとしては mysqljs/mysql を利用します。

    npm install mysql
    

    RdsSample.js

    // 依存ライブラリ
    var mysql = require('mysql');
    var connection = mysql.createConnection({
      host: 'mydbinstance.cncechgxndis.ap-northeast-1.rds.amazonaws.com',
      user: 'mymasteruser',
      password: 'mymasteruser',
      database: 'mydb'
    });
    
    // Lambda 関数が実行される度に処理される内容です。
    exports.handler = function(event, context, callback) {
    
      // コネクションを確立します。
      connection.connect(function(err) {
        if (err) {
          console.error('error connecting: ' + err.stack);
          return;
        }
        console.log('connected as id ' + connection.threadId);
      });
    
      // テーブルを作成します。
      connection.query('CREATE TABLE IF NOT EXISTS my_table (cola VARCHAR(32) PRIMARY KEY, colb INT)', function (error) {
        if (error) throw error;
        console.log('created my_table');
      });
    
      // レコードを削除します。
      connection.query('DELETE FROM my_table', function (error, results, fields) {
        if (error) throw error;
        console.log('deleted ' + results.affectedRows + ' rows');
      });
    
      // レコードを挿入します。
      connection.query('INSERT INTO my_table VALUES ?', [
        [['aaa', 123], ['bbb', 987]]
      ], function (error, results, fields) {
        if (error) throw error;
        console.log('inserted ' + results.affectedRows + ' rows');
      });
    
      // レコードを検索します。
      connection.query('SELECT ?? FROM ?? WHERE cola = ?', [
        ['cola', 'colb'], // `??` によって ' ではなく ` で囲います。
        'my_table', // `??` によって ' ではなく ` で囲います。
        'bbb'
      ], function (error, results, fields) {
        if (error) throw error;
        console.log(JSON.stringify(results));
      });
    
      // コネクションを切断します。
      connection.end();
    
      // Lambda 関数の呼出しもとに結果を返します。
      callback(null, "message");
    };
    

    zip 化します。

    zip -r RdsSample.zip RdsSample.js node_modules/
    

    create-function コマンドで AWS にアップロードします。--vpc-config で RDS と同じサブネットを指定します。古いバージョンの aws コマンドでは --vpc-config を利用できないことがあります。

    aws lambda create-function \
    --profile lambda-test-user-20170929 \
    --region ap-northeast-1 \
    --function-name RdsSample \
    --zip-file fileb://RdsSample.zip \
    --role arn:aws:iam::123412341234:role/my-lambda-rds-role \
    --handler RdsSample.handler \
    --runtime nodejs6.10 \
    --vpc-config SubnetIds=subnet-xxxxxxxx,subnet-yyyyyyyy,SecurityGroupIds=sg-zzzzzzzz
    

    動作検証

    invoke コマンドで実行して CloudWatch ログが想定通りに出力されることを確認します。

    aws lambda invoke \
    --profile lambda-test-user-20170929 \
    --region ap-northeast-1 \
    --invocation-type RequestResponse \
    --function-name RdsSample \
    output.txt
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    サーバーレスとDevOpsに注力中。AWSを使った効率的なインフラ構築が得意です。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • AWS EC2 インスタンスの選定方法
        準仮想化と完全仮想化 AWS のインスタンスタイプが準仮想化と完全仮想化のどちらの仮想化技術を採用したハードウェアであるかによって、使用できる AMI (OS) が異なるのは以下の理由によります。 準仮想化 ParaVirtualization (PV) において OS は自分が仮想化用のハードウェア上で動作していることを知っています。つまり仮想化用にカスタマイズされた専用の OS が必要になりま...
        yuki_coderyuki_coder9/30/2017に更新
        いいねアイコン画像0
      • OpenVPN で二つの VPC をつなぐための設定
        インターネット VPN (Virtual Private Network) には二拠点間の通信を暗号化する方式によって IPsec-VPN や SSL-VPN などがあります。OpenVPN は SSL-VPN の実装のひとつです。AWS VPC を二つ用意してそれらを OpenVPN で接続してみます。 VPC の構成 myvpc-1 (10.1.0.0/16) mysubnet-1-1 (10...
        takuyatakuya9/11/2017に更新
        いいねアイコン画像0
      • Windows Server EC2 インスタンスへの CAL インストール
        サムネイル画像-8bae43ea3b
        Windows サーバを AWS EC2 インスタンスとして起動した後は、RDP 接続が必要となります。RDP 接続を行なうためには Remote Desktop Services (RDS) ライセンスが必要となります。 Windows Server のライセンスは、管理用途の RDS 接続を許可しています。その際に RDS ライセンスは不要です。ただし、[同時接続数が 2 という制限があります...
        けんちゃんけんちゃん12/18/2023に更新
        いいねアイコン画像0
      • AWS Lambda の基本的な使い方
        サムネイル画像-9285163f6b
        AWS Lambda はイベントドリブンな「関数」を登録できるサービスです。例えば S3 に画像がアップロードされたときにサムネイル用のサイズに加工する処理が記述された関数を登録できます。基本的な使い方をまとめます。 事前準備 関数の登録はブラウザで AWS コンソールにログインして行うこともできますが、本ページでは AWS C
        yuki_coderyuki_coder2/18/2020に更新
        いいねアイコン画像0
      • AWS 落穂拾い (Data Engineering)
        Kinesis Kinesis Streams データは 3 AZ にレプリケーションされます。Amazon Kinesis Data Streams FAQs 24 時間 (既定値) から 1 年までデータ保持できます。[Changing the Data Retention Period](https://docs.aws.amazon
        yuki_coderyuki_coder1/22/2025に更新
        いいねアイコン画像0