【问题标题】:how to create an iam role with policy that grants access to the SQS created如何使用授予对创建的 SQS 的访问权限的策略创建 iam 角色
【发布时间】:2021-10-20 12:31:26
【问题描述】:

我使用 main.tf 中调用 SQS/main.tf 模块的代码创建了 2 个 SQS 和 DeadLetterQueue。我想销毁并再次创建它们,但这次,我想将 IAM/iam_role.tf 称为很好地与策略文档一起创建一个 IAM 角色。我不知道如何在我的 main.tf 中指定它,以便数据策略文档的资源部分同时创建 CloudTrail_SQS,意思是“CloudTrail_SQS_Data_Event”和“cloudTrail_SQS_Management_Event”和S3 的资源 arn 赋予角色访问用于 SQS 的 2 个不同存储桶的权限,即“cloudtrail-management-event-logs”和“aws-cloudtrail143-sqs-logs”

SQS/main.tf
resource "aws_sqs_queue" "CloudTrail_SQS"{
    name                       = var.sqs_queue_name
    redrive_policy = jsonencode({
        deadLetterTargetArn    = aws_sqs_queue.CloudTrail_SQS_DLQ.arn
        maxReceiveCount        = 4
    })
}
resource "aws_sqs_queue" "CloudTrail_SQS_DLQ"{
    name                       = var.dead_queue_name

IAM/iam_role.tf
resource "aws_iam_role" "access_role" {
  name               = var.role_name
  description        = var.description
  assume_role_policy = data.aws_iam_policy_document.trust_relationship.json
}
trust policy
data "aws_iam_policy_document" "trust_relationship" {
  statement {
    sid     = "AllowAssumeRole"
    actions = ["sts:AssumeRole"]

    principals {
      type        = "AWS"
      identifiers = [var.account_id]
    }

    condition {
      test     = "StringEquals"
      variable = "sts:ExternalId"

      values = [var.external_id]
    }
  }
}
data "aws_iam_policy_document" "policy_document"{
  statement{
    actions = [
      "sqs:GetQueueUrl",
      "sqs:ReceiveMessage",
      "sqs:SendMessage"
    ]
    effect = "Allow"
    resources = aws_sqs_queue.CloudTrail_SQS.arn
  }
  statement {
    actions = ["sqs:ListQueues"]
    effect  = "Allow"
    resources = ["*"]
  }
  statement {
    actions = ["s3:GetObject", "s3:GetBucketLocation"]
    resources = [
      "arn:aws:s3:::${var.cloudtrail_event_log_bucket_name}/*"
    ]
    effect = "Allow"
  }
  statement {
    actions = ["s3:ListBucket"]
    resources = [
      "arn:aws:s3:::${var.cloudtrail_event_log_bucket_name}"
    ]
    effect = "Allow"
  }
  statement {
    actions = ["kms:Decrypt", "kms:GenerateDataKey","kms:DescribeKey" ]
    effect = "Allow"
    resources = [var.kms_key_arn]
  }
}
main.tf
module "data_events"{
  source = "../SQS"

  cloudtrail_event_log_bucket_name = "aws-cloudtrail143-sqs-logs"
  sqs_queue_name                   = "CloudTrail_SQS_Data_Event"
  dead_queue_name                  = "CloudTrail_DLQ_Data_Event"
}


module "management_events"{
  source = "../SQS"

  cloudtrail_event_log_bucket_name = "cloudtrail-management-event-logs"
  sqs_queue_name                   = "cloudTrail_SQS_Management_Event"
  dead_queue_name                  = "cloudTrail_DLQ_Management_Event"

}

【问题讨论】:

  • 现行政策有什么问题?有什么错误吗?
  • 它创建了一个重复的角色,但我只想创建一个角色,然后授予该角色访问创建的 2 个 s3 存储桶的权限,还授予该角色访问创建的 2 个 SQS 的权限
  • 为什么会创建重复角色?您的代码没有显示任何此类情况。事实上你根本没有使用IAM/iam_role.tf
  • 我不确定我做错了什么。我希望能够同时调用 IAM 和 SQS,并让它只创建一个角色并授予该角色对 2 个 SQS 和 2 个 S3 的访问权限桶访问
  • 我不知道如何在我的 main.tf 中引用那行代码

标签: amazon-web-services terraform


【解决方案1】:

将创建角色,如下所示。但是您的问题有很多错误和缺失的信息,因此不可能提供完整的工作代码。所以下面的代码应该被视为一个模板,您需要根据自己的使用进行调整。


resource "aws_iam_role" "access_role" {
  name               = var.role_name
  description        = var.description
  
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Sid    = ""
        Principal = {
          Service = "ec2.amazonaws.com"
        }
      },
    ]
  })
  
  inline_policy {
    name   = "allow-access-to-s3-sqs"
    policy = data.aws_iam_policy_document.policy_document.json
  }  
  
}


data "aws_iam_policy_document" "policy_document"{
  statement{
    actions = [
      "sqs:GetQueueUrl",
      "sqs:ReceiveMessage",
      "sqs:SendMessage"
    ]
    effect = "Allow"
    resources = [
           module.data_events.sqs.arn,
           module.management_events.sqs.arn,
           ]
  }
  statement {
    actions = ["sqs:ListQueues"]
    effect  = "Allow"
    resources = ["*"]
  }
  statement {
    actions = ["s3:GetObject", "s3:GetBucketLocation"]
    resources = [
      "arn:aws:s3:::aws-cloudtrail143-sqs-logs/*"
      "arn:aws:s3:::cloudtrail-management-event-logs/*"
    ]
    effect = "Allow"
  }
  statement {
    actions = ["s3:ListBucket"]
    resources = [
      "arn:aws:s3:::aws-cloudtrail143-sqs-logs",
      "arn:aws:s3:::cloudtrail-management-event-logs"      
    ]
    effect = "Allow"
  }
  statement {
    actions = ["kms:Decrypt", "kms:GenerateDataKey","kms:DescribeKey" ]
    effect = "Allow"
    resources = [var.kms_key_arn]
  }
}

【讨论】:

  • ,谢谢你的模板,它正是我需要的。我需要在我调用 SQS 和 IAM 配置的 Main.tf 中添加任何内容
  • @bibi 正如我所写,您提供的代码无论如何都不正确。有很多问题。一个例子,缺少引号,角色没有信任策略,模块未定义,......所以无论有没有角色,你的代码都不会工作。
  • 我会更新代码
  • 代码已更新
  • @bibi 我建议接受我的回答,尝试基于它编写自己的代码或 IAM 模块。很大程度上取决于data_eventsmanagement_events 模块的确切定义方式,尤其是它们返回的内容。这在当前问题中没有显示,并且是从新问题开始的好地方。此外,您还必须指出在创建 data_eventsmanagement_events 模块后您希望如何使用您的 IAM 模块?如何将输入变量传递给 IAM 模块?
【解决方案2】:

您可以使用data terraform 来源。

此时,你应该将输出写入SQS文件夹,将它们作为数据写入IAM文件夹并使用它

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多