【问题标题】:AWS Lambda, Terraform - Add Role to Lambda that References a Not-Yet-Created LambdaAWS Lambda、Terraform - 将角色添加到引用尚未创建的 Lambda 的 Lambda
【发布时间】:2021-11-14 15:52:47
【问题描述】:

解决方案:诀窍是创建另一个角色,该角色不附加到 lambda 角色,而是通过 STS 承担。

TL;DR 如何创建一个 Lambda 函数可以承担的角色,该角色引用 lambda,创建 lambda 之前

大家好,

我将 Terraform v1.0.5 与 AWS 一起使用。我有一个 lambda,其中包含以下代码:

assumed_role = sts_client.assume_role(
        ...
        RoleSessionName="tms_rules_settings_lambda",
        ...
    )

为此,我必须给我的 lambda 一个策略,让它可以承担这样的角色。因此,我有以下 Terraform。

locals {
  tms_rules_settings_lambda_role_name = "tms_rules_settings_lambda_role"
  tms_rules_settings_lambda_func_name = "tms_rules_settings_lambda"
}
...
** The Lambda Setup**
resource "aws_lambda_function" "tms_rules_settings_lambda" {
  ...
  function_name = local.tms_rules_settings_lambda_func_name
  role = aws_iam_role.tms_rules_settings_lambda_role.arn
  ...
}
...
** The Lambda Role Setup**
resource "aws_iam_role" "tms_rules_settings_lambda_role" {

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "AWS": "arn:aws:sts::${data.aws_caller_identity.current.account_id}:assumed-role/${local.tms_rules_settings_lambda_role_name}/${local.tms_rules_settings_lambda_func_name}",
        "Service": "lambda.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF

}

这会导致以下错误:

Error: Error creating IAM Role tms_rules_settings_lambda_role: 

MalformedPolicyDocument: Invalid principal in policy: 

"AWS":"arn:aws:sts::267601234567:assumed-role/tms_rules_settings_lambda_role/tms_rules_settings_lambda"

我相信这是因为 lambda 和角色相互引用,而当一个不存在时它会爆炸。

当主体(lambda)不存在时,我如何为 lambda 创建角色。

非常感谢任何帮助。

【问题讨论】:

  • @Marcin 我停止尝试将角色附加到 Lambda,而是将角色附加到任何内容。 Lambda 被授予担任此角色的权限。所以我的代码承担了这个角色并做它需要做的事情。
  • 感谢您告诉我。如果给出的任何答案有帮助,那么接受它是一种很好的做法。

标签: amazon-web-services aws-lambda terraform


【解决方案1】:

很遗憾,您不能这样做。有效的原则必须存在,然后您才能在任何 IAM 策略或角色中使用它。因此,您要么必须在原理 arn 中使用通配符,要么首先创建函数,然后在 lambda 存在后更新其角色或权限。

【讨论】:

    【解决方案2】:

    当您在策略声明中使用角色作为委托人时,您使用的是角色 ARN,而不是 STS 为您提供的假定角色委托人。您使用了后者,这就是您收到错误的原因。

    但是...在我看来,您正在尝试将角色添加到它自己的假设角色策略。为什么要这么做?角色不需要自己承担。

    【讨论】:

    • 我这样做是因为我必须获得一个基于 TenantId 的动态且受限制的策略(我对此事也不太了解)。为此,我需要从角色所在的 STS 获取凭据。 cognito_idp_client = session.client('cognito-idp', region_name=region_name, aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey' ], aws_session_token=credentials["SessionToken"], )
    • 但是local.tms_rules_settings_lambda_roleaws_iam_role. tms_rules_settings_lambda_role 是同一个角色,对吧?您正在赋予已经担任该角色的人承担该角色的能力,但他们不必这样做,因为他们已经拥有它。如果您希望它起作用,则 lambda 角色将需要与具有tenantId 的角色不同。您可以通过编写基于 sts:RoleSessionName 条件键的条件来检查会话名称(租户 ID):docs.aws.amazon.com/IAM/latest/UserGuide/…
    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 2021-11-17
    • 2021-09-15
    • 2021-05-15
    • 2017-07-26
    • 2023-04-10
    • 2019-07-16
    • 2019-10-14
    相关资源
    最近更新 更多