运行阶跃函数所需的策略
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 函数之外),它们似乎可以正常工作以上是关于运行阶跃函数所需的策略的主要内容,如果未能解决你的问题,请参考以下文章