运行阶跃函数所需的策略

Posted

技术标签:

【中文标题】运行阶跃函数所需的策略【英文标题】:required policies for running step function 【发布时间】:2021-12-30 08:19:03 【问题描述】:

我想创建一个运行 lambda 函数的阶跃函数。这些是我现在附加到我的状态机和角色的策略:

resource "aws_iam_role_policy" "sfn_policy" 
  policy = jsonencode(

  "Version": "2012-10-17",
  "Statement": [
    
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
       "Resource": "*"
    ,
    
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:InvokeAsync"
            ],
            "Resource": "*"
    ,
    
            "Effect": "Allow",
             "Action": [ "states:StartExecution" ],
            "Resource": "*"
        
  ]

  )
  role = aws_iam_role.processing_lambda_role.id



resource "aws_sfn_state_machine" "sfn_state_machine_zip_files" 
  name     = local.zip_files_step_function_name
  role_arn = aws_iam_role.processing_lambda_role.arn

  definition = <<EOF

  "Comment": "Process Incoming Zip Files",
  "StartAt": "ProcessIncomingZipFiles",
  "States": 
    "ProcessIncomingZipFiles": 
      "Type": "Task",
      "Resource": "$aws_lambda_function.process_zip_files_lambda.arn",
      "ResultPath": "$.Output",
      "End": true
    
  

EOF

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

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


resource "aws_iam_role_policy" "lambda" 
  name = local.processing_lambda_permission_name
  role = aws_iam_role.processing_lambda_role.id

  policy = jsonencode(
    Version   = "2012-10-17"
    Statement = [
      
        Effect   = "Allow"
        Action   = [
          "s3:ListBucket",
          "s3:HeadObject",
          "s3:GetObject",
          "s3:GetObjectVersion",
          "s3:PutObject"
        ]
        Resource = [
          aws_s3_bucket.ingest.arn,
          "$aws_s3_bucket.ingest.arn/*",
          aws_s3_bucket.dwh.arn,
          "$aws_s3_bucket.dwh.arn/*",
        ]
      ,
      
        Effect   = "Allow"
        Action   = [
          "s3:DeleteObject"
        ]
        Resource = ["$aws_s3_bucket.ingest.arn/*"]
      ,
      
        Effect   = "Allow"
        Action   = [
          "kms:Decrypt",
          "kms:GenerateDataKey",
        ]
        # If it breaks because of permission to the s3 buckets, look here
        Resource = "*"
        #Resource = [aws_kms_key.dwh.arn, aws_kms_key.ingest.arn]
      ,
    ]
  )

是否缺少任何政策?目前,我收到此错误:

"Neither the global service principal states.amazonaws.com, nor the regional one is authorized to assume the provided role."

我知道 step 函数确实启动了,因为我看到它进入了 TaskStateEntered。但是,在运行 lambda 函数时它会失败。

【问题讨论】:

【参考方案1】:

AssumeRole 动作不是这样使用的。它用于另一个身份(阅读:资源) - 不是原则 - 承担该角色。 (即你真的不应该在 AssumeRole 中使用 * 作为资源)。例如,如果您在账户 A 中有一个角色可以访问 s3 存储桶和一个 lambda,那么您希望账户 B 中的 lambda 能够访问它,您可以在 B 中创建一个角色,该角色可以承担在 A 中的角色并给予 AssumeRole 允许他们两个(其他人作为资源)

您似乎正在尝试使用它为服务提供使用此角色的能力,这是不必要的 - 原则字段是告诉给定服务它可以使用角色的内容。

我不确定您的“处理 Lamda 角色”应该附加到什么 - 如果它附加到给定的 lambda,那么它需要具有 lambda 需要执行的权限 - 即:s3 或 dynamo,以及执行自身的基本 Execution。你可以,如果你愿意(并且它被推荐,但不是必需的)为状态机的资源设置一个允许权限来执行它

类似(有点伪代码,请仔细检查动作名称,当然还有格式)


   action: function:Execute,
   effect: Allow,
   resource: aws:state:machine:arn

关于 lambda 角色。如果您在上面添加principle: aws:the:lambda:arn:who:uses:this:role,它将仅限制提到的 lambda 能够使用策略的这一部分。 - 换句话说,状态机将被授予(允许)执行 Lambda 权限(因为它是提到的资源),但如果这个角色在另一个 lambda 上,而不是原则中提到的那个,它不能只执行那个。

IAM 一开始可能有点令人困惑——天知道我为此苦苦挣扎了好几个月——但归根结底是这样的:

否认是隐含的 执行任何操作都需要显式允许 明确否认胜过一切 Resources 是系统/服务的 arn,它将获得对附加此角色的系统/服务的这些权限 原则是允许谁使用此角色或此特定操作。

(这是一个非常快速且非常笼统的概述 - 它的内容远不止这些,但它是一个很好的起点)

例如,您可以授予状态机执行 lambda a 的权限(通过该 lambda 的 arn 的允许执行和资源),而不必对 lambdas 角色执行任何操作来允许它,这也变得令人困惑。它由两个相互作用的策略中的至少一个给出,这就足够了。或者您可以授予状态机 arn 权限以允许 lambda 的角色策略,这就足够了!

【讨论】:

所以每当一个新项目到达我的发电机表时,它都会运行一个触发器。该触发器运行 step 函数。 lambda 函数 process_zip_files 现在只打印事件。没有其他的。根据您的回答,我不确定接下来的步骤是什么...... 我在 terraform 中为状态函数和 lambdas 使用相同的角色。我在上面添加了更多代码。 我正在运行具有相同角色和策略集的其他 lambda 函数(在 step 函数之外),它们似乎可以正常工作

以上是关于运行阶跃函数所需的策略的主要内容,如果未能解决你的问题,请参考以下文章

阶跃函数匹配全模型AIC

什么依赖策略适合这个小应用

使用 Lambda 函数覆盖 AWS Auto Scaling 策略

所需的 JSON 文件具有运行程序之前的旧值

函数未返回所需的字符串

是否有窗口函数或窗口函数组合可用于通过 TSQL 获得所需的结果