【问题标题】:How to give a Lambda function in a state machine access to describe the state machine?如何让状态机中的 Lambda 函数访问来描述状态机?
【发布时间】:2021-05-12 13:16:23
【问题描述】:

我有一个LambdaInvoke,它是状态机的一部分。我已将input_path="$$.Execution" 指定为give it the state machine execution ARN。现在,如何让属于LambdaInvoke 的LambdaFunction 访问StateMachine 上的states:DescribeExecution?

state_machine.grant_read(lambda_invoke.lambda_function) 和 lambda_function.role.add_to_policy(aws_iam.PolicyStatement(resources=[state_machine.state_machine_arn], actions=["states:DescribeExecution"]) 都导致 CloudFormation 失败,因为“资源之间的循环依赖”。依赖列表:

  1. 上述Lambda函数的角色默认策略
  2. 另一个启动状态机的 Lambda 函数角色的默认策略
  3. 启动状态机的 Lambda 函数
  4. 状态机
  5. 步骤 1 中的 Lambda 函数
  6. 包含启动状态机的 Lambda 函数的堆栈

【问题讨论】:

    标签: python amazon-web-services aws-lambda aws-cdk aws-step-functions


    【解决方案1】:

    无论StateMachine 是如何启动的,都有两种不同的角色,一种用于您的Lambda 功能,另一种用于您的StateMachine。让我们以向sqs 发送消息为例。您可以直接使用 StateMachine 和 sqs 集成来完成此操作,或者您可以使用 Lambda 为您完成此操作。

    状态机角色

    StateMachine 的角色需要用于记录等目的,但也取决于您使用的集成,例如如果您有sqs:sendMessage,则需要附加sqs 策略才能启用它。如果您在StateMachine 中使用Lambda Functions,则需要为lambda:InvokeFunction 制定政策。

    Lambda 函数角色 假设您有一个Lambda 向SQS 发送消息,您没有在定义文件中使用arn:aws:states:::sqs:sendMessage...,那么您的StateMachine 角色只需要lambda:InvokeFunction 权限,但您的Lambda 需要权限到sqs。

    现在对于您的用例,您的Lambda 需要拥有states:DescribeExecution 的权限,而不是sqs。如果您的 Lambda 函数在控制台中成功运行,并且您的 StateMachine 有权执行该函数,那么一切都应该正常运行。

    如果您有一个Lambda 启动一个StateMachine,它只需要访问即可启动一个StateMachine。

    循环依赖问题

    你没有真正的循环依赖问题,你有权限问题。除了每次启动StateMachine 时创建一个新角色之外,您不能将 Lambda 限定为一个实例,原因是在IAM 的条件键上下文中没有任何可以引用的内容json 所以这种方法不起作用。您可以将Lambda 限制为仅对特定StateMachine 执行,但同样适用于所有用户。

    实际上并没有内在需要 Lambda,由 StateMachine 发起来描述它所发起的 StateMachine。原因是您可以简单地将 StateMachine 的状态传递给该函数。

    【讨论】:

    • 在这种情况下,问题变成了如何将状态机中其他条目的输出与上下文对象 ($$) 结合起来。我找不到有关 input_path 参数如何工作的详细文档。
    • 一般来说,你真的不应该使用你的执行历史作为状态。您在给定步骤中需要的任何信息都应该以您当前的状态存在。如果是这种情况,您应该为此重构。如果您确实有一个有效的用例,即您的状态机中需要如此多的数据,那么您应该将其外部化到数据库中。合并在一起的并行步骤将作为数组出现stackoverflow.com/questions/54105792/…
    • 我写了一个follow-up question。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多