首页 > 解决方案 > 在创建 Elastic Beanstalk 环境时,有什么方法可以在创建时在 RDS MySQL 实例中创建触发器和存储过程?

问题描述

默认情况下,在创建 Elastic Beanstalk 环境期间创建的 RDS MySQL 实例不允许创建触发器、函数和存储过程,因为主用户没有 SUPER 权限,启用二进制日志记录,并且log_bin_trust_function_creators为 false。因此,在 container_commands 中尝试此操作的任何脚本都将失败。

这可以实例化后通过更改为非默认数据库参数组来解决log_bin_trust_function_creators = 1。有关如何以交互方式执行此操作的说明,请参阅此视频。但是,您似乎无法在创建时将新实例与非默认参数组相关联。因此,您必须在没有触发器和存储过程的情况下进行实例化,修改实例以使用非默认参数组,重新启动实例,然后才能运行脚本来创建触发器和存储过程。

更糟糕的是,您甚至不能让创建触发器的 container_commands 运行,因为这会导致实例化失败,并且您无法获得可以应用所描述的手动干预的工作实例。因此,您需要在创建期间将您的 container_commands 注释掉,然后在随后的重启后“eb deploy”期间重新启用。在这种情况下,您无法自动创建需要 DDL 创建触发器、函数或存储过程的环境。

标签: mysqlamazon-web-servicesamazon-rdsamazon-elastic-beanstalk

解决方案


这个问题是在考虑特定 MySQL 参数的情况下编写的,但它适用于需要非默认数据库参数组的任何情况。在与 AWS 技术支持讨论后,您可以在环境创建期间将非默认数据库参数组关联到 RDS 实例。我会建议文档可能会更好;-)

这个例子是特定于 MySQL 8.0 ( mysql8.0) 的,但是很明显你会针对你的特定情况进行更改。

将以下内容添加到 .ebextensions/ 中的文件中

Resources:
  customdbparametergroup:
    Type: 'AWS::RDS::DBParameterGroup'
    Properties:
      Description: "DB parameter group for Beanstalk RDS instance which enables functions, procedures, and triggers"
      Family: "mysql8.0"
      Parameters:
        "log_bin_trust_function_creators" : 1

  AWSEBRDSDatabase:
      Properties:
        DBParameterGroupName:
          Ref: customdbparametergroup

当然,如果您已经有一个带有Resources:节的配置文件,您只需添加参数组资源和AWSEBRDSDatabase密钥。当您检查创建的实例时,参数组名称将以通常的方式被破坏。您必须在配置中将参数组声明为资源,即您不能指定现有参数组的名称。


推荐阅读