【问题标题】:Create RDS DB User CloudFormation创建 RDS 数据库用户 CloudFormation
【发布时间】:2020-11-02 01:07:54
【问题描述】:

由于 CloudFormation 本身不支持为 RDS 数据库创建数据库用户,因此我正在寻找通过 CustomResource 执行此操作的方法。但是,即使我编写了一个由 Lambda 函数支持的 CustomResource,我也看不到允许我将用户添加到数据库实例的 RDS API 端点。

谁能建议为由 Postgres 10 数据库引擎支持的 Aurora 集群创建数据库用户的潜在方法?

【问题讨论】:

    标签: amazon-cloudformation amazon-rds aws-cloudformation-custom-resource


    【解决方案1】:

    我没有看到允许我将用户添加到数据库实例的 RDS API 端点。

    通常您会将自定义资源设置为在创建 RDS 后触发。因此,您可以使用例如函数环境变量将 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
    
    
    

    【讨论】:

    • 我得到了使用不同堆栈或 DependsOn 的部分,以便在创建数据库后执行。但是,问题是 - 创建数据库后如何配置数据库用户。我相信 Lambda 必须与 RDS API 端点合作才能进行任何更改。但是,RDS API 没有公开任何创建数据库用户的功能。
    • @NitinRastogi 您必须使用 mysql(或等效于您的数据库)客户端连接到数据库,并使用 SQL 命令创建用户。
    • 很抱歉,我该如何在 Lambda 上做到这一点?据我所知,Lambda 不支持使用 JDBC 或任何其他数据库驱动程序等“传统客户端连接方法”,而是使用 RDS API 进行数据库交互。
    • @NitinRastogi 我用pymysql添加了一个这样的lambda示例。请注意使用 lambda 层来提供python37-PyMySQL(其公共层)。显然,需要调整示例以创建用户或执行您需要的其他操作。希望对你有用。
    猜你喜欢
    • 2023-03-14
    • 2014-12-25
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2018-10-10
    相关资源
    最近更新 更多