[{"data":1,"prerenderedAt":54},["ShallowReactive",2],{"snippet-lambda-function-connect-rds-iam":3},{"id":4,"title":5,"contributors":6,"description":9,"extension":10,"gitHub":11,"introBox":14,"languages":18,"meta":22,"resources":23,"services":24,"snippets":27,"stem":50,"tags":51,"type":52,"__hash__":53},"snippets\u002Fsnippets\u002Flambda-function-connect-rds-iam.json","Connect to Amazon RDS from AWS Lambda",[7,8],"content\u002Fcontributors\u002Fabhishek-agawane.json","content\u002Fcontributors\u002Fjon-loinaz.json","This snippet demonstrates how to connect to an Amazon RDS database from an AWS Lambda function with IAM authentication. It connects directly to the RDS instance or cluster endpoint and does not require an RDS Proxy. This snippet is valid for MariaDB\u002FMySQL or Aurora for MySQL","json",{"template":12},{"repoURL":13},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-snippets\u002Ftree\u002Fmain\u002Flambda-function-connect-rds-iam",{"headline":15,"text":16},"How it works",[17],"Amazon Relational Database Service (Amazon RDS) is a collection of managed services that makes it simple to set up, operate, and scale databases in the cloud. Choose from seven popular engines. Connect to an RDS database using IAM authentication.",[19,20,21],"Go","Ruby","Javascript",{},null,[25,26],"lambda-event-functions","rds",[28],{"title":29,"codeTabs":30},"Runtimes",[31,38,44],{"id":19,"title":32,"description":33,"snippets":34},"Copy the code into your Lambda function","Follow the AWS Lambda instructions for packaging with dependencies and uploading in .zip format. This snippet uses the go mysql driver",[35],{"language":36,"code":37},"go","\u002F\u002F Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n\u002F\u002F SPDX-License-Identifier: Apache-2.0\n\u002F*\nGolang v2 code here.\n*\u002F\n\npackage main\n\nimport (\n\t\"context\"\n\t\"database\u002Fsql\"\n\t\"encoding\u002Fjson\"\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\n\t\"github.com\u002Faws\u002Faws-lambda-go\u002Flambda\"\n\t\"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fconfig\"\n\t\"github.com\u002Faws\u002Faws-sdk-go-v2\u002Ffeature\u002Frds\u002Fauth\"\n\t_ \"github.com\u002Fgo-sql-driver\u002Fmysql\"\n)\n\ntype MyEvent struct {\n\tName string `json:\"name\"`\n}\n\nfunc HandleRequest(event *MyEvent) (map[string]interface{}, error) {\n\n\tvar dbName string = os.Getenv(\"DatabaseName\")\n\tvar dbUser string = os.Getenv(\"DatabaseUser\")\n\t\u002F\u002F DBHost is the RDS instance\u002Fcluster endpoint (hostname without https).\n\t\u002F\u002F An RDS Proxy is not required for IAM authentication.\n\tvar dbHost string = os.Getenv(\"DBHost\")\n\tdbPort, err := strconv.Atoi(os.Getenv(\"Port\")) \u002F\u002F Add port number\n\tif err != nil {\n\t\tpanic(\"invalid port number: \" + err.Error())\n\t}\n\tvar dbEndpoint string = fmt.Sprintf(\"%s:%d\", dbHost, dbPort)\n\tvar region string = os.Getenv(\"AWS_REGION\")\n\n\tcfg, err := config.LoadDefaultConfig(context.TODO())\n\tif err != nil {\n\t\tpanic(\"configuration error: \" + err.Error())\n\t}\n\n\tauthenticationToken, err := auth.BuildAuthToken(\n\t\tcontext.TODO(), dbEndpoint, region, dbUser, cfg.Credentials)\n\tif err != nil {\n\t\tpanic(\"failed to create authentication token: \" + err.Error())\n\t}\n\n\tdsn := fmt.Sprintf(\"%s:%s@tcp(%s)\u002F%s?tls=true&allowCleartextPasswords=true\",\n\t\tdbUser, authenticationToken, dbEndpoint, dbName,\n\t)\n\n\tdb, err := sql.Open(\"mysql\", dsn)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tdefer db.Close()\n\n\tvar sum int\n\terr = db.QueryRow(\"SELECT ?+? AS sum\", 3, 2).Scan(&sum)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\ts := fmt.Sprint(sum)\n\tmessage := fmt.Sprintf(\"The selected sum is: %s\", s)\n\n\tmessageBytes, err := json.Marshal(message)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tmessageString := string(messageBytes)\n\treturn map[string]interface{}{\n\t\t\"statusCode\": 200,\n\t\t\"headers\":    map[string]string{\"Content-Type\": \"application\u002Fjson\"},\n\t\t\"body\":       messageString,\n\t}, nil\n}\n\nfunc main() {\n\tlambda.Start(HandleRequest)\n}\n",{"id":20,"title":32,"description":39,"snippets":40},"Follow the AWS Lambda instructions for packaging with ruby dependencies with Ruby gem and bundler. This snippet uses the mysql2 gem so needs to use lambda containers",[41],{"language":42,"code":43},"ruby","# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n# Ruby code here.\n\nrequire 'aws-sdk-rds'\nrequire 'json'\nrequire 'mysql2'\n\ndef lambda_handler(event:, context:)\n  endpoint = ENV['DBEndpoint'] # Add the endpoint without https\"\n  port = ENV['Port']           # 3306\n  user = ENV['DBUser']\n  region = ENV['DBRegion']     # 'us-east-1'\n  db_name = ENV['DBName']\n\n  credentials = Aws::Credentials.new(\n    ENV['AWS_ACCESS_KEY_ID'],\n    ENV['AWS_SECRET_ACCESS_KEY'],\n    ENV['AWS_SESSION_TOKEN']\n  )\n  rds_client = Aws::RDS::AuthTokenGenerator.new(\n    region: region, \n    credentials: credentials\n  )\n\n  token = rds_client.auth_token(\n    endpoint: endpoint+ ':' + port,\n    user_name: user,\n    region: region\n  )\n\n  begin\n    conn = Mysql2::Client.new(\n      host: endpoint,\n      username: user,\n      password: token,\n      port: port,\n      database: db_name,\n      sslca: '\u002Fvar\u002Ftask\u002Fglobal-bundle.pem', \n      sslverify: true,\n      enable_cleartext_plugin: true\n    )\n    a = 3\n    b = 2\n    result = conn.query(\"SELECT #{a} + #{b} AS sum\").first['sum']\n    puts result\n    conn.close\n    {\n      statusCode: 200,\n      body: result.to_json\n    }\n  rescue =&#62; e\n    puts \"Database connection failed due to #{e}\"\n  end\nend",{"id":21,"title":32,"description":45,"snippets":46},"Follow the AWS Lambda instructions for packaging with dependencies and uploading in .zip format. This snippet uses the mysql2\u002Fpromise library.",[47],{"language":48,"code":49},"js","﻿\u002F\u002F Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n\u002F\u002F SPDX-License-Identifier: Apache-2.0\n\u002F* \nNode.js code here.\n*\u002F\n\u002F\u002F ES6+ example\nimport { Signer } from \"@aws-sdk\u002Frds-signer\";\nimport mysql from 'mysql2\u002Fpromise';\n\nasync function createAuthToken() {\n  \u002F\u002F Define connection authentication parameters\n  const dbinfo = {\n    \u002F\u002F The RDS instance\u002Fcluster endpoint. An RDS Proxy is not required for IAM\n    \u002F\u002F authentication; you can point this directly at your DB endpoint.\n    hostname: process.env.DBHostName,\n    port: process.env.Port,\n    username: process.env.DBUserName,\n    region: process.env.AWS_REGION,\n\n  }\n\n  \u002F\u002F Create RDS Signer object\n  const signer = new Signer(dbinfo);\n\n  \u002F\u002F Request authorization token from RDS, specifying the username\n  const token = await signer.getAuthToken();\n  return token;\n}\n\nasync function dbOps() {\n\n  \u002F\u002F Obtain auth token\n  const token = await createAuthToken();\n  \u002F\u002F Define connection configuration\n  let connectionConfig = {\n    host: process.env.DBHostName,\n    user: process.env.DBUserName,\n    password: token,\n    database: process.env.DBName,\n    ssl: 'Amazon RDS'\n  }\n  \u002F\u002F Create the connection to the DB\n  const conn = await mysql.createConnection(connectionConfig);\n  \u002F\u002F Obtain the result of the query\n  const [res,] = await conn.execute('select ?+? as sum', [3, 2]);\n  return res;\n\n}\n\nexport const handler = async (event) =&#62; {\n  \u002F\u002F Execute database flow\n  const result = await dbOps();\n  \u002F\u002F Return result\n  return {\n    statusCode: 200,\n    body: JSON.stringify(\"The selected sum is: \" + result[0].sum)\n  }\n};\n","snippets\u002Flambda-function-connect-rds-iam",[],"Integration","dypWaeKn86Nmg04d3Su05RsnQRgGVKLKpS6x-Y1QbJI",1792578864411]