Skip to content

StringList encoded incorrectly in the simulation #74

@mackensen

Description

@mackensen

I have this block of code that gets the security groups from an EFS mount target and then creates a new mount target using that value:

    this.restoreDocument.addStep(new AwsApiStep(this, 'DescribeSourceMountTargetSecurityGroups', {
      service: AwsService.EFS,
      pascalCaseApi: 'DescribeMountTargetSecurityGroups',
      apiParams: {
        MountTargetId: '{{ DescribeSourceMountTargets.SourceMountTargetId }}',
      },
      outputs: [
        {
          outputType: DataTypeEnum.STRING_LIST,
          name: 'SourceSecurityGroups',
          selector: '$.SecurityGroups',
        }
      ]
    }));
...
    this.restoreDocument.addStep(new AwsApiStep(this, 'CreateMountTargetAZ1', {
      service: AwsService.EFS,
      pascalCaseApi: 'CreateMountTarget',
      apiParams: {
        FileSystemId: '{{ DescribeTargetFileSystem.TargetFileSystemId }}',
        SubnetId: '{{ GetParameterPrivateSubnetAZ1.PrivateSubnetAZ1 }}',
        SecurityGroups: '{{ DescribeSourceMountTargetSecurityGroups.SourceSecurityGroups }}',
      },
      outputs: []
    }));

This deploys via CDK without any issues and works. However, the simulator throws an exception. I've mocked the target creation:

    awsInvoker.whenThen(
      {
        awsApi: 'createMountTarget',
        awsParams: {
          SecurityGroups: 'sg-XXX',
          FileSystemId: 'fs-YYY,
          SubnetId: 'subnet-ZZZ'
        },
        service: AwsService.EFS,
      },
      {}
    );

I added some debugging which revealed it's JSON.parse() throwing the exception, on this (invalid) generated string:

{"FileSystemId":"fs-YYY","SubnetId":"subnet-ZZZ","SecurityGroups":"["sg-XXX"]"}

Full log:

    SyntaxError: Expected ',' or '}' after property value in JSON at position 97
        at JSON.parse (<anonymous>)
        at DictFormat.resolveToDict (../node_modules/@cdklabs/cdk-ssm-documents/src/interface/variables/string-variable.ts:134:4)
        at AwsApiSimulation.executeStep (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation/aws-api-simulation.ts:39:44)
        at AutomationStepSimulation.tryExecute (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:233:42)
        at AutomationStepSimulation.executeWithRetries (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:215:21)
        at AutomationStepSimulation.invokeWithFallback (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:117:29)
        at AutomationStepSimulation.invoke (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:107:17)
        at AutomationStepSimulation.invokeWithFallback (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:122:80)
        at AutomationStepSimulation.invoke (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:107:17)
        at AutomationStepSimulation.invokeWithFallback (../node_modules/@cdklabs/cdk-ssm-documents/src/simulation/automation-step-simulation.ts:122:80)

Any guidance would be appreciated. Thanks for all the excellent work on this project!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions