【问题标题】:MalformedPolicyDocument: Policy document should not specify a principalMalformedPolicyDocument:策略文档不应指定主体
【发布时间】:2021-12-28 07:31:03
【问题描述】:

我正在尝试使用 terraform 创建一个状态函数。首先,我创建一个策略并将其分配给现有角色 processing_lambda_role

resource "aws_iam_role_policy" "sfn_policy" {
  policy = jsonencode(
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "states.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:InvokeAsync"
            ],
            "Resource": "*"
        }
  ]
}
  )
  role = aws_iam_role.processing_lambda_role.id
}


resource "aws_sfn_state_machine" "sfn_state_machine" {
  name     = local.step_function_name
  role_arn = aws_iam_role.processing_lambda_role.arn

  definition = <<EOF
{
  "Comment": "Get Incoming Files",
  "StartAt": "GetIncomingFiles",
  "States": {
    "GetIncomingFiles": {
      "Type": "Task",
      "Resource": "${aws_lambda_function.get_incoming_lambda.arn}",
      "ResultPath": "$.Output",
      "End": true
    }
  }
}
EOF
}

我收到此错误:

Error: Error putting IAM role policy terraform-20211117095209110000000005: MalformedPolicyDocument: Policy document should not specify a principal.
│       status code: 400, request id: 1dd8ac18-a514-4ef3-93ae-91383e5baa07
│ 
│   with module.ingest_system["ems"].aws_iam_role_policy.sfn_policy,
│   on ../../modules/ingest_system/step_function.tf line 1, in resource "aws_iam_role_policy" "sfn_policy":
│    1: resource "aws_iam_role_policy" "sfn_policy" {

这就是最初定义角色的方式:

resource "aws_iam_role" "processing_lambda_role" {
  name = local.processing_lambda_role_name
  path = "/service-role/"

  assume_role_policy = jsonencode({
    Version   = "2012-10-17"
    Statement = [
      {
        Effect    = "Allow"
        Principal = { Service = "lambda.amazonaws.com" }
        Action    = "sts:AssumeRole"
      }
    ]
  })
}

【问题讨论】:

  • sts:AssumeRole 东西需要是 processing_lambda_role 信任关系的一部分,而不是策略的一部分。或者您希望策略中的 AssumeRole 实现什么?
  • 对我来说更改角色/策略比信任关系更方便。那可能吗? @luk2302
  • 取决于你想做什么,如果你想让 statemachine 或 lambda 承担角色,那么不,你需要把那些东西放到信任关系中。如果您想允许该角色承担其他角色,那么您可以将这些内容放入策略中。这就是 IAM 的工作原理。
  • 不,仍然面临这样的问题:stackoverflow.com/questions/70036850/… 有什么想法吗? @Marcin
  • 您的意思是在我的回答仍然存在后您报告的完全相同的错误?或者你有新问题?

标签: amazon-web-services terraform terraform-provider-aws aws-policies terraform-aws-modules


【解决方案1】:

sts:AssumeRole 应该在角色的assume_role_policy 中。例如,如果你想为你的 sfn 创建sfn_role,那么:


resource "aws_iam_role" "sfn_role" {
  assume_role_policy = jsonencode({
    Version   = "2012-10-17"
    Statement = [
      {
        Effect    = "Allow"
        Principal = { Service = "states.amazonaws.com" }
        Action    = "sts:AssumeRole"
      }
    ]
  })
}

resource "aws_iam_role_policy" "sfn_policy" {
  policy = jsonencode(
{
  "Version": "2012-10-17",
  "Statement": [    
    {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:InvokeAsync"
            ],
            "Resource": "*"
        }
  ]
}
  )
  role = aws_iam_role.sfn_role.id
}

resource "aws_sfn_state_machine" "sfn_state_machine" {
  name     = local.step_function_name
  role_arn = aws_iam_role.sfn_role.arn
  # ....
}

【讨论】:

  • 抱歉,我不确定它与我的代码有何不同?我已经在processing_lambda_role 中给了Sts:AssumeRole,不是吗?我错过了什么?
  • @x89 你的aws_iam_role_policy.sfn_policyPrincipal,这是不正确的。应该和我的例子一样。
  • 如果我删除 Principal/service 部分,我仍然会收到错误 Policy statement must contain resources.
  • @x89 所以添加"Resource": "*" 或者如果你愿意的话更具体。
  • 啊,我仍然遇到这个权限问题:stackoverflow.com/questions/70036850/…
猜你喜欢
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 2019-09-15
  • 2017-11-02
  • 2017-07-27
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多