كيفية الوصول إلى قاعدة بيانات RDS الخاصة بك مع وظيفة Lambda و Serverless

إذا كنت تستخدم إطار عمل Serverless لنشر وظائف lambda باستخدام مورد AWS آخر (مثل قاعدة بيانات RDS) ، فستحتاج إلى الاتصال عبر VPC / Subnet.

أول،

تثبيت serverless

# تثبيت CLI serverless
npm تثبيت -G serverless
# تحديث serverless من إصدار سابق من serverless
npm تثبيت -G serverless
# تسجيل الدخول إلى النظام الأساسي بدون خادم (اختياري)
تسجيل الدخول بدون خادم

قم بإنشاء تطبيقك وتثبيت الحزم

# إنشاء خدمة / مشروع Serverless جديد
$ serverless إنشاء - قالب aws - nodejs - مسار خدمة بلدي
# التغيير في الدليل المنشأ حديثا
مؤتمر نزع السلاح خدمة بلدي
# تثبيت الحزم
npm $ i express@4.16.2 mysql2@1.5.2 sequelize@4.33.2 serverless@1.28.0

تكوين بيانات الاعتماد الخاصة بك لنشر

الآن ، يتعين علينا تكوين اتصال قاعدة البيانات الخاصة بنا. سوف أقوم بإنشاء مجلد تهيئة مع ملف database.js

//database.js
const Sequelize = require ('sequelize') ؛
const sequelize = جديد sequelize (
    process.env.MYSQLDATABASE،
    process.env.MYSQLUSER،
    process.env.MYSQLPASS،
    {
        المضيف: process.env.MYSQLHOST ،
        اللهجة: 'mysql' ،
        المنفذ: process.env.MYSQLPORT ،
        تسجيل الدخول: خطأ ،
        حوض السباحة: {
            الحد الأقصى: 5 ،
            الحد الأدنى: 0 ،
            الخمول: 20000 ،
            handleDisconnects: صحيح
        }،
        dialectOptions: {
            requestTimeout: 100000
        }،
        حدد: {
            freezeTableName: صحيح
        }
    }
)؛
var db = {}؛
db.sequelize = sequelize؛
db.Sequelize = Sequelize؛
module.exports = db؛

في ملف handler.js ، أقوم بالاتصال بقاعدة البيانات وأقوم ببعض الاستعلامات (يتم تشغيل مثال lambda بواسطة SNS)

"استخدام صارم" ؛
قاعدة بيانات var = require ('./ config / database') ؛
var sequelize = database.sequelize؛
module.exports.send = (حدث ، سياق ، رد اتصال) => {
  var message = JSON.parse (event.Records [0] .Sns.Message)؛
  واسمحوا معرف = message.id ؛
sequelize.query (`SELECT * FROM User WHERE ID = $ {id}`، {type: sequelize.QueryTypes.SELECT})
  .ثم (المستخدمين => {
        // منطقك هنا
  })؛
رد الاتصال (null ، {message: 'Finished'، event})؛
}؛

الآن يتعين علينا الحصول على معرّفات VPC و Subnet لتكوين ملف yml الخاص بنا.

في وحدة AWS Security Group Area ، ابحث عن RDS الذي تريد الحصول عليه.

مجموعات الأمان

بعد ذلك ، قم بالوصول إلى لوحة معلومات VPC> الشبكة الفرعية وابحث عن ثلاث شبكات فرعية متاحة (معرف الشبكة الفرعية)

قائمة الشبكات الفرعية

مع هذا ، يمكننا تكوين ملف serverless.yml الخاص بك

# مرحبا بكم في serverless. قراءة المستندات
# https://serverless.com/framework/docs/
# Serverless.yml هو التكوين CLI
الخدمة: إرسال المؤسسة
مزود:
  الاسم: أوس
  المرحلة: همز
  وقت التشغيل: nodejs6.10
  المنطقة: لنا شرق -1
  VPC:
    securityGroupIds:
      - HERE_YOUR_SECURITY_GROUP
    subnetIds:
      - HERE_YOUR_SUBNET_1
      - HERE_YOUR_SUBNET_2
      - HERE_YOUR_SUBNET_3
  بيئة:
    MYSQLHOST: 'xxxxx.rds.amazonaws.com'
    MYSQLPORT: "xxx"
    MYSQLUSER: 'xxx'
    MYSQLPASS: 'xxxxx'
    MYSQLDATABASE: 'xxxx'
المهام:
  إرسال:
    معالج: handler.send
    علامات:
      المشروع: "xxxx"
    الأحداث:
      - sns: arn: aws: sns: us-east-1: xxxxx: xxxx
مصادر:
  مصادر:
    AWSLambdaVPCAccessExecutionRole:
      النوع: AWS :: IAM :: ManagedPolicy
      الخصائص:
        الوصف ؛: إنشاء سياسة ل vpc connetion.
        الأدوار:
          - {"Ref": "IamRoleLambdaExecution"}
        وثيقة سياسة:
            الإصدار: "2012-10-17"
            بيان:
            - التأثير: اسمح
              عمل:
                - ec2: CreateNetworkInterface
                - ec2: DescriptionNetworkInterfaces
                - ec2: DeleteNetworkInterface
              المصدر: "*"

بعض التفاصيل.

  1. كما قلت ، فإن المشغل الخاص بي هو رسالة SNS ، لذلك يجب علي تكوين قسم الموضوع في قسم الوظائف ؛
  2. يمكنني استخدام العلامات في قسم الوظائف ، حتى أتمكن من تتبع فواتيري بشكل أسهل ؛
  3. في قسم الموارد ، سمحت بإمكانية الوصول إلى lambda حتى أتمكن من عرض VPC / Subnets أثناء النشر.

الآن يمكنك نشر وظيفتك والاختبار.

SLS نشر -V

إذا كان لديك بعض المشاكل مع أي خطوات ، فقط أخبرني. وإذا ساعدك هذا البرنامج التعليمي ، أعطني بعض التصفيق!