Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(stepfunctions-tasks): allow camelCase for parameters of CallAwsServiceCrossRegion #30795

Merged
merged 2 commits into from
Jul 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { CrossRegionAwsSdkSingletonFunction } from '../../../custom-resource-han
*/
export interface CallAwsServiceCrossRegionProps extends sfn.TaskStateBaseProps {
/**
* The AWS service to call in AWS SDK for JavaScript v3 style.
* The AWS service to call in AWS SDK for JavaScript v3 format.
*
* @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/
* @example 's3'
Expand All @@ -26,9 +26,7 @@ export interface CallAwsServiceCrossRegionProps extends sfn.TaskStateBaseProps {
readonly action: string;

/**
* Parameters for the API action call.
*
* Use PascalCase for the parameter names.
* Parameters for the API action call in AWS SDK for JavaScript v3 format.
*
* @default - no parameters
*/
Expand Down Expand Up @@ -112,12 +110,6 @@ export class CallAwsServiceCrossRegion extends sfn.TaskStateBase {
if (!Token.isUnresolved(props.action) && !props.action.startsWith(props.action[0]?.toLowerCase())) {
throw new Error(`action must be camelCase, got: ${props.action}`);
}
if (props.parameters) {
const invalidKeys = Object.keys(props.parameters).filter((key) => !key.startsWith(key[0]?.toUpperCase()));
if (invalidKeys.length) {
throw new Error(`parameter names must be PascalCase, got: ${invalidKeys.join(', ')}`);
}
}

// props.service expects a service name in the AWS SDK for JavaScript v3 format.
// In some services, this format differs from the one used in IAM.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,40 @@ test('with custom IAM action', () => {
});
});

test('parameters with camelCase', () => {
// WHEN
const task = new tasks.CallAwsServiceCrossRegion(stack, 'GetRestApi', {
service: 'api-gateway',
action: 'getRestApi',
parameters: {
restApiId: 'id',
},
region: 'us-east-1',
iamResources: ['*'],
retryOnServiceExceptions: false,
});

// THEN
expect(stack.resolve(task.toStateJson())).toEqual({
Type: 'Task',
Resource: {
'Fn::GetAtt': [
'CrossRegionAwsSdk8a0c93f3dbef4b71ac137aaf2048ce7eF7430F4F',
'Arn',
],
},
End: true,
Parameters: {
action: 'getRestApi',
region: 'us-east-1',
service: 'api-gateway',
parameters: {
restApiId: 'id',
},
},
});
});

test('throws with invalid integration pattern', () => {
expect(() => new tasks.CallAwsServiceCrossRegion(stack, 'GetObject', {
integrationPattern: sfn.IntegrationPattern.RUN_JOB,
Expand Down Expand Up @@ -189,19 +223,6 @@ test('throws if action is not camelCase', () => {
})).toThrow(/action must be camelCase, got: GetObject/);
});

test('throws if parameters has keys as not PascalCase', () => {
expect(() => new tasks.CallAwsServiceCrossRegion(stack, 'GetObject', {
service: 's3',
action: 'getObject',
parameters: {
bucket: 'my-bucket',
key: sfn.JsonPath.stringAt('$.key'),
},
region: 'us-east-1',
iamResources: ['*'],
})).toThrow(/parameter names must be PascalCase, got: bucket, key/);
});

test('can pass additional IAM statements', () => {
// WHEN
const task = new tasks.CallAwsServiceCrossRegion(stack, 'DetectLabels', {
Expand Down