0

Dynamodb 使用 aws CDK 定义并部署到 localstack:

new Table(this, 'idlist-staging', {
      tableName: 'idlist-staging',
      readCapacity: 1,
      writeCapacity: 1,
      partitionKey: { name: 'external_id', type: AttributeType.STRING },
      pointInTimeRecovery: true,
      removalPolicy: RemovalPolicy.DESTROY,
      billingMode: BillingMode.PROVISIONED
    });

本地堆栈上的状态机具有以下条目:

    "Deletion": {
      "Type": "Task",
      "Resource": "arn:aws:states:::dynamodb:deleteItem",
      "Parameters": {
        "TableName": "idlist-staging",
        "Key": {
          "external_id": {
            "S.$": "$.exid"
          }
        }
      },
      "Next": "Confirmation",
      "ResultPath": null
    },

按要求更新:构造状态机的 cdk 代码:

    const machine = new CfnStateMachine(this, smId, {
      stateMachineName: 'sync-machine-staging',
      // role already has Effect.Allow on dynamodb put/get/delet + db arn
      roleArn: role.roleArn,
      definitionString: JSON.stringify(
        stateMachineDefinition,
      ),
    });

引用 dynamodb 表的正确方法是什么?我们是否仍将arn:aws:states:::dynamodb:deleteItem其用作资源和idlist-staging表,因为一旦状态机更新为引用 dynamodb,cdk 将不会部署。CDK 在从 step 函数中删除引用时部署。

任何有关如何解决此问题或调试此问题的帮助表示赞赏。

更新 - 最后上面的作品,它是stateMachineDefinition格式不正确的字符串。

4

1 回答 1

1

编辑:用CfnStateMachine构造定义的状态机

CfnStateMachine有一个definitionSubstitutions道具来替换以下值:

一个映射(字符串到字符串),它指定状态机定义中占位符变量的映射。这使客户能够在状态机定义中注入在运行时获得的值,例如从内部函数中获得的值。变量可以是模板参数名称、资源逻辑 ID、资源属性或键值映射中的变量。

这里有一个Cfn 示例。替代目标采用以下形式"${tableName}"

StateMachine使用构造定义的状态机

CDK 完成繁重的工作来解析依赖结构之间的资源名称。我们的工作是将tableNameandtableArn作为变量传递给状态机实例。

这是一个堆栈的工作示例,该堆栈具有在 AWS 中按预期部署和执行的构造(未使用 LocalStack)TableStateMachine

export class MyAwesomeStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    const table = new dynamo.Table(this, 'idlist-staging', {
      tableName: 'idlist-staging',
      partitionKey: { name: 'external_id', type: dynamo.AttributeType.STRING },
      billingMode: dynamo.BillingMode.PAY_PER_REQUEST,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });

    const deleteItemTask = new tasks.CallAwsService(this, 'delete-table-task', {
      service: 'dynamodb',
      action: 'deleteItem',
      comment: 'call the dynamo delete item API to delete the item passed as $.exid',
      parameters: {
        TableName: table.tableName,  // <- pass the table name
        Key: { external_id: { "S.$": '$.exid' } },
      },
      iamResources: [table.tableArn], // <- pass the table arn for permissions
      outputPath: '$.deleteItem'
    });

    new sfn.StateMachine(this, 'my-step-function', {
      definition: deleteItemTask.next(new sfn.Succeed(scope, 'Done!')),
    });
  }
}

CDK 使用部署时参考生成 CloudFormation 输出。例如,生成的 Cfn 模板中状态机的 IAM 权限语句使用 deploy-time Fn::GetAtt

"Statement": [
  {
    "Action": "dynamodb:deleteItem",
    "Effect": "Allow",
    "Resource": { "Fn::GetAtt": [ "idliststaging30186BA1", "Arn"]}
  }
]

在我们的例子中,CDK 自动处理依赖关系。但是,有时 CDK 会出现问题,从而导致部署时错误。没问题!如果需要,我们可以像这样显式设置依赖项:myStateMachine.node.addDependency(table).

于 2021-12-02T12:13:37.713 回答