创建 RDS 数据库用户 CloudFormation
Create RDS DB User CloudFormation
由于 CloudFormation 本身不支持为 RDS 数据库创建数据库用户,我正在寻找通过 CustomResource 执行此操作的方法。但是,即使我编写了一个由 Lambda 函数支持的 CustomResource,我也看不到允许我将用户添加到数据库实例的 RDS API 端点。
有人可以建议为由 Postgres 10 数据库引擎支持的 Aurora 集群创建数据库用户的潜在方法吗?
I do not see an RDS API endpoint that would allow me to add a user to a database instance.
通常您会将自定义资源设置为在创建 RDS 后触发。因此,您可以使用函数 environment variables.
将 RDS 端点 url 传递给 lambda
实际上,自定义资源上的 DependsOn 属性可用于确保自定义资源在成功创建 RDS 后触发。如果您通过环境变量传递 RDS url,则实际上不需要。
使用 pymysql
:
示例 lambda 更新代码
MyLambdaFunction:
Type: AWS::Lambda::Function
Properties:
Handler: index.lambda_handler
Role: !Ref ExecRoleArn
Runtime: python3.7
Environment:
Variables:
DB_HOSTNAME: !Ref DbHostname
DB_USER: !Ref DbMasterUsername
DB_PASSWORD: !Ref DbMasterPassword
DB_NAME: !Ref DbName
VpcConfig:
SecurityGroupIds: [!Ref SecurityGroupId]
SubnetIds: !Ref SubnetIds
Code:
ZipFile: |
import base64
import json
import os
import logging
import random
import sys
import pymysql
import boto3
rds_host = os.environ['DB_HOSTNAME']
rds_user = os.environ['DB_USER']
rds_password = os.environ['DB_PASSWORD']
rds_dbname = os.environ['DB_NAME']
logger = logging.getLogger()
logger.setLevel(logging.INFO)
try:
conn = pymysql.connect(rds_host,
user=rds_user,
passwd=rds_password,
db=rds_dbname,
connect_timeout=5)
except:
logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
sys.exit()
def lambda_handler(event, context):
print(json.dumps(event))
with conn.cursor() as cur:
cur.execute("create table if not exists Employee (EmpID int NOT NULL auto_increment, Name varchar(255) NOT NULL, PRIMARY KEY (EmpID))")
conn.commit()
return {
'statusCode': 200,
'body': ""
}
Timeout: 60 #
MemorySize: 128
Layers:
- arn:aws:lambda:us-east-1:113088814899:layer:Klayers-python37-PyMySQL:1
由于 CloudFormation 本身不支持为 RDS 数据库创建数据库用户,我正在寻找通过 CustomResource 执行此操作的方法。但是,即使我编写了一个由 Lambda 函数支持的 CustomResource,我也看不到允许我将用户添加到数据库实例的 RDS API 端点。
有人可以建议为由 Postgres 10 数据库引擎支持的 Aurora 集群创建数据库用户的潜在方法吗?
I do not see an RDS API endpoint that would allow me to add a user to a database instance.
通常您会将自定义资源设置为在创建 RDS 后触发。因此,您可以使用函数 environment variables.
将 RDS 端点 url 传递给 lambda实际上,自定义资源上的 DependsOn 属性可用于确保自定义资源在成功创建 RDS 后触发。如果您通过环境变量传递 RDS url,则实际上不需要。
使用 pymysql
:
MyLambdaFunction:
Type: AWS::Lambda::Function
Properties:
Handler: index.lambda_handler
Role: !Ref ExecRoleArn
Runtime: python3.7
Environment:
Variables:
DB_HOSTNAME: !Ref DbHostname
DB_USER: !Ref DbMasterUsername
DB_PASSWORD: !Ref DbMasterPassword
DB_NAME: !Ref DbName
VpcConfig:
SecurityGroupIds: [!Ref SecurityGroupId]
SubnetIds: !Ref SubnetIds
Code:
ZipFile: |
import base64
import json
import os
import logging
import random
import sys
import pymysql
import boto3
rds_host = os.environ['DB_HOSTNAME']
rds_user = os.environ['DB_USER']
rds_password = os.environ['DB_PASSWORD']
rds_dbname = os.environ['DB_NAME']
logger = logging.getLogger()
logger.setLevel(logging.INFO)
try:
conn = pymysql.connect(rds_host,
user=rds_user,
passwd=rds_password,
db=rds_dbname,
connect_timeout=5)
except:
logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
sys.exit()
def lambda_handler(event, context):
print(json.dumps(event))
with conn.cursor() as cur:
cur.execute("create table if not exists Employee (EmpID int NOT NULL auto_increment, Name varchar(255) NOT NULL, PRIMARY KEY (EmpID))")
conn.commit()
return {
'statusCode': 200,
'body': ""
}
Timeout: 60 #
MemorySize: 128
Layers:
- arn:aws:lambda:us-east-1:113088814899:layer:Klayers-python37-PyMySQL:1