【问题标题】:Terraform RDS Instance monitoring_role_arn does not workTerraform RDS 实例 monitoring_role_arn 不起作用
【发布时间】:2021-08-23 12:04:06
【问题描述】:

我正在尝试使用 Terraform 创建一个 AWS RDS DB 实例。我正在尝试使用 PostgreSQL 12 作为数据库。除了我无法在脚本中指定“monitoring_role_arn”的监控部分之外,一切似乎都很好。

以下是我创建 PostgreSQL 数据库实例的 Terraform 脚本:

rds.tf

# AWS PSQL RDS Instance 
resource "aws_db_instance" "test-DB" {

  depends_on = [aws_security_group.test-PSQL-DB-SG, aws_iam_role.test-IAM-Role-RDS]

  // General Configurations
  name                 = "testdb"
  identifier = "am-poc-spoke1-db"
  engine               = "postgres"
  engine_version       = "12.5"
  instance_class       = "db.t2.micro" 
  parameter_group_name = "default.postgres12"
  port = "5432"

  // Authentication
  username             = "postgres"
  password             = "postgres"

  // Storage Configurations
  storage_type = "gp2"
  allocated_storage    = 20
  max_allocated_storage = 100

  // Networking and Security 
  vpc_security_group_ids = [aws_security_group.test-PSQL-DB-SG.id]
  availability_zone = "ap-southeast-1a"
  publicly_accessible = false

  // Backup Configuration
  backup_retention_period = 7
  backup_window = "16:00-16:30"
  copy_tags_to_snapshot = true

  // Monitoring and Performance Insight
  performance_insights_enabled = true
  performance_insights_retention_period = 7

  monitoring_interval = "60"
  monitoring_role_arn = aws_iam_role.test-IAM-Role-RDS.arn
  enabled_cloudwatch_logs_exports = ["postgresql"]

  // Other Configurations
  auto_minor_version_upgrade = false
  deletion_protection = false
  skip_final_snapshot = true

  tags = {
    Name = "test-DB"
  }
}

由于“monitoring_role_arn”需要具有“AmazonRDSEnhancedMonitoringRole”策略的 AWS IAM 角色,因此我也为此创建了一个脚本。

iam-role.tf

# IAM Role for RDS Enhanced Monitoring
resource "aws_iam_role" "test-IAM-Role-RDS" {

  name = "test-IAM-Role-RDS"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Sid    = ""
        Principal = {
          Service = "ec2.amazonaws.com"
        }
      },
    ]
  })

  tags = {
    Name = "test-IAM-Role-RDS"
  }
}

然后是添加到 IAM 角色的策略。

iam-role-policy.tf

# IAM Role Policy for RDS Enhanced Monitoring
resource "aws_iam_role_policy" "test-Enhanced-Monitoring-Policy" {

  depends_on = [aws_iam_role.test-IAM-Role-RDS]

  name = "test-Enhanced-Monitoring-Policy"
  role = aws_iam_role.test-IAM-Role-RDS.id

  policy = jsonencode({
    "Version": "2012-10-17",
    "Statement": [{
            "Sid": "EnableCreationAndManagementOfRDSCloudwatchLogGroups",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:PutRetentionPolicy"
            ],
            "Resource": [
                "arn:aws:logs:*:*:log-group:RDS*"
            ]
        },
        {
            "Sid": "EnableCreationAndManagementOfRDSCloudwatchLogStreams",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:log-group:RDS*:log-stream:*"
            ]
        }
    ]
  })
}

运行'terraform plan' 时不会显示错误。但是一旦我运行'terraform apply',我就会收到以下错误。

错误:创建数据库实例时出错:InvalidParameterValue:IAM 角色 ARN 值无效或不包括以下所需的权限: ENHANCED_MONITORING │状态码:400,请求id: 59e6127d-f39a-453d-885a-868e38415fc1,{

现在有人可以解决这个问题吗?

【问题讨论】:

  • 您可以尝试附加托管策略AmazonRDSEnhancedMonitoringRole 而不是自己创建。
  • 并查看github.com/pulumi/pulumi/issues/5628承担角色策略中的服务不应该是monitoring.rds.amazonaws.com
  • 您是否从github.com/hashicorp/terraform/issues/5455 获得了政策?您是否尝试从策略的 rds_instance 添加depends_on
  • 您好。我尝试使用托管策略 AmazonRDSEnhancedMonitoringRole 而不是创建自己的策略。然而问题仍然存在。然后我对角色进行了更改。你是对的,将assume role policyec2.amazonaws.com 更改为 monitoring.rds.amazonaws.com 就可以了,而且效果很好。谢谢。
  • 因此,更改为:1. 使用托管策略。添加代码行:managed_policy_arns = ["arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole"],然后为 Service 更改:Principal = {Service = "monitoring.rds.amazonaws.com"}

标签: amazon-web-services terraform amazon-rds amazon-iam terraform-provider-aws


【解决方案1】:

没有使用 内联策略,而是使用了托管策略,即 AmazonRDSEnhancedMonitoringRole。也就是说,我们已将 AWS 托管策略直接添加到我们的 IAM 角色中。

另外,我已将 IAM 角色中的 Serviceec2.amazonaws.com 更改为 monitoring.rds.amazonaws.com。错误实际上是被触发的,因为我们没有这个改变。认为它也适用于内联策略,但我们可以避免使用 AWS 托管策略的额外代码行,而不是创建新的内联策略。

全部更改:

iam.tf

# IAM Role for RDS Enhanced Monitoring
resource "aws_iam_role" "test-IAM-Role-RDS" {

  name = "test-IAM-Role-RDS"
  assume_role_policy = jsonencode({
         Version = "2012-10-17"
          Statement = [
            {
              Action = "sts:AssumeRole"
              Effect = "Allow"
              Sid    = ""
              Principal = {
                Service = "monitoring.rds.amazonaws.com"
             }
            },
          ]
        })

  managed_policy_arns = ["arn:aws:iam::aws:policy/service-  role/AmazonRDSEnhancedMonitoringRole"]

  tags = {
    Name = "test-IAM-Role-RDS"
  }
}

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 2018-09-01
    • 1970-01-01
    • 2017-02-14
    • 2019-07-18
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多