Skip to content

Commit 50ba3ef

Browse files
authoredMar 5, 2025
fix(scheduler-targets-alpha): update inspector target to use IAssessmentTemplate instead of CfnAssessmentTemplate (#33682)
### Issue # (if applicable) Closes #<issue number here>. ### Reason for this change Adhere to AWS CDK best practice/design guidelines to not expose L1 resources/properties in L2 APIs. ### Description of changes Changed `InspectorStartAssessmentRun` target constructor to accept `IAssessmentTemplate` instead of `CfnAssessmentTemplate` ### Describe any new or updated permissions being added n/a ### Description of how you validated changes Updated unit tests and integration test - no snapshot changes ### Checklist - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) BREAKING CHANGE: The `InspectorStartAssessmentRun` target's constructor now accepts `IAssessmentTemplate` instead of `CfnAssessmentTemplate` as its parameter type. To migrate existing code, use the `AssessmentTemplate.fromCfnAssessmentTemplate()` method to convert your `CfnAssessmentTemplate` instances to `IAssessmentTemplate`. ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent 4d8eae9 commit 50ba3ef

File tree

4 files changed

+22
-15
lines changed

4 files changed

+22
-15
lines changed
 

‎packages/@aws-cdk/aws-scheduler-targets-alpha/README.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,9 @@ called every hour by EventBridge Scheduler.
222222
```ts
223223
import * as inspector from 'aws-cdk-lib/aws-inspector';
224224

225-
declare const assessmentTemplate: inspector.CfnAssessmentTemplate;
225+
declare const cfnAssessmentTemplate: inspector.CfnAssessmentTemplate;
226+
227+
const assessmentTemplate = inspector.AssessmentTemplate.fromCfnAssessmentTemplate(this, 'MyAssessmentTemplate', cfnAssessmentTemplate);
226228

227229
new Schedule(this, 'Schedule', {
228230
schedule: ScheduleExpression.rate(Duration.minutes(60)),
@@ -316,7 +318,7 @@ new Schedule(this, 'Schedule', {
316318

317319
## Invoke a wider set of AWS API
318320

319-
Use the `Universal` target to invoke AWS API. See https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html
321+
Use the `Universal` target to invoke AWS API. See <https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html>
320322

321323
The code snippet below creates an event rule with AWS API as the target which is
322324
called at midnight every day by EventBridge Scheduler.

‎packages/@aws-cdk/aws-scheduler-targets-alpha/lib/inspector-start-assessment-run.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
import { IScheduleTarget } from '@aws-cdk/aws-scheduler-alpha';
22
import { IRole, PolicyStatement } from 'aws-cdk-lib/aws-iam';
3-
import { CfnAssessmentTemplate } from 'aws-cdk-lib/aws-inspector';
3+
import { IAssessmentTemplate } from 'aws-cdk-lib/aws-inspector';
44
import { ScheduleTargetBase, ScheduleTargetBaseProps } from './target';
55

66
/**
77
* Use an Amazon Inspector as a target for AWS EventBridge Scheduler.
88
*/
99
export class InspectorStartAssessmentRun extends ScheduleTargetBase implements IScheduleTarget {
1010
constructor(
11-
template: CfnAssessmentTemplate,
11+
template: IAssessmentTemplate,
1212
props: ScheduleTargetBaseProps = {},
1313
) {
14-
super(props, template.attrArn);
14+
super(props, template.assessmentTemplateArn);
1515
}
1616

1717
protected addTargetActionToRole(role: IRole): void {
1818
role.addToPrincipalPolicy(new PolicyStatement({
1919
actions: ['inspector:StartAssessmentRun'],
20+
// The wildcard is intentional here as Amazon Inspector does not support specifying a resource ARN in the Resource element of an IAM policy statement.
21+
// See https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazoninspector.html#amazoninspector-resources-for-iam-policies.
2022
resources: ['*'],
2123
}));
2224
}

‎packages/@aws-cdk/aws-scheduler-targets-alpha/test/inspector-start-assessment-run.test.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,27 @@ import { ScheduleExpression, Schedule, Group } from '@aws-cdk/aws-scheduler-alph
22
import { App, Duration, Stack } from 'aws-cdk-lib';
33
import { Template } from 'aws-cdk-lib/assertions';
44
import { AccountRootPrincipal, Role } from 'aws-cdk-lib/aws-iam';
5-
import { CfnAssessmentTarget, CfnAssessmentTemplate } from 'aws-cdk-lib/aws-inspector';
5+
import { AssessmentTemplate, CfnAssessmentTarget, CfnAssessmentTemplate, IAssessmentTemplate } from 'aws-cdk-lib/aws-inspector';
66
import * as sqs from 'aws-cdk-lib/aws-sqs';
77
import { InspectorStartAssessmentRun } from '../lib';
88

99
describe('schedule target', () => {
1010
let app: App;
1111
let stack: Stack;
12-
let template: CfnAssessmentTemplate;
12+
let template: IAssessmentTemplate;
1313
const expr = ScheduleExpression.at(new Date(Date.UTC(1969, 10, 20, 0, 0, 0)));
1414
const roleId = 'SchedulerRoleForTarget78b2d848BF7444';
1515

1616
beforeEach(() => {
1717
app = new App({ context: { '@aws-cdk/aws-iam:minimizePolicies': true } });
1818
stack = new Stack(app, 'Stack', { env: { region: 'us-east-1', account: '123456789012' } });
1919
const assessmentTarget = new CfnAssessmentTarget(stack, 'MyAssessmentTarget');
20-
template = new CfnAssessmentTemplate(stack, 'MyTemplate', {
20+
const cfnAssessmentTemplate = new CfnAssessmentTemplate(stack, 'MyTemplate', {
2121
assessmentTargetArn: assessmentTarget.attrArn,
2222
durationInSeconds: 3600,
2323
rulesPackageArns: ['arn:aws:inspector:us-east-1:316112463485:rulespackage/0-gEjTy7T7'],
2424
});
25+
template = AssessmentTemplate.fromCfnAssessmentTemplate(stack, 'AssessmentTemplate', cfnAssessmentTemplate);
2526
});
2627

2728
test('creates IAM role and IAM policy for inspector assessment template in the same account', () => {
@@ -278,11 +279,12 @@ describe('schedule target', () => {
278279
},
279280
});
280281
const assessmentTarget = new CfnAssessmentTarget(stack2, 'AnotherTarget');
281-
const anotherTemplate = new CfnAssessmentTemplate(stack2, 'AnotherTemplate', {
282+
const cfnAssessmentTemplate = new CfnAssessmentTemplate(stack2, 'AnotherTemplate', {
282283
assessmentTargetArn: assessmentTarget.attrArn,
283284
durationInSeconds: 3600,
284285
rulesPackageArns: ['arn:aws:inspector:us-east-1:316112463485:rulespackage/0-gEjTy7T7'],
285286
});
287+
const anotherTemplate = AssessmentTemplate.fromCfnAssessmentTemplate(stack2, 'AnotherAssessmentTemplate', cfnAssessmentTemplate);
286288

287289
const inspectorTarget = new InspectorStartAssessmentRun(anotherTemplate);
288290

@@ -363,11 +365,12 @@ describe('schedule target', () => {
363365
},
364366
});
365367
const assessmentTarget = new CfnAssessmentTarget(stack2, 'AnotherTarget');
366-
const anotherTemplate = new CfnAssessmentTemplate(stack2, 'AnotherTemplate', {
368+
const cfnAssessmentTemplate = new CfnAssessmentTemplate(stack2, 'AnotherTemplate', {
367369
assessmentTargetArn: assessmentTarget.attrArn,
368370
durationInSeconds: 3600,
369371
rulesPackageArns: ['arn:aws:inspector:us-east-1:316112463485:rulespackage/0-gEjTy7T7'],
370372
});
373+
const anotherTemplate = AssessmentTemplate.fromCfnAssessmentTemplate(stack2, 'AnotherAssessmentTemplate', cfnAssessmentTemplate);
371374
const importedRole = Role.fromRoleArn(stack, 'ImportedRole', 'arn:aws:iam::123456789012:role/someRole');
372375

373376
const inspectorTarget = new InspectorStartAssessmentRun(anotherTemplate, {

‎packages/@aws-cdk/aws-scheduler-targets-alpha/test/integ.inspector-start-assessment-run.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as scheduler from '@aws-cdk/aws-scheduler-alpha';
22
import { ExpectedResult, IntegTest } from '@aws-cdk/integ-tests-alpha';
33
import * as cdk from 'aws-cdk-lib';
4-
import { CfnAssessmentTarget, CfnAssessmentTemplate } from 'aws-cdk-lib/aws-inspector';
4+
import { AssessmentTemplate, CfnAssessmentTarget, CfnAssessmentTemplate } from 'aws-cdk-lib/aws-inspector';
55
import { InspectorStartAssessmentRun } from '../lib';
66

77
/*
@@ -17,12 +17,12 @@ const app = new cdk.App();
1717
const stack = new cdk.Stack(app, 'aws-cdk-scheduler-targets-inspector-start-assessment-run');
1818

1919
const assessmentTarget = new CfnAssessmentTarget(stack, 'MyAssessmentTarget');
20-
const assessmentTemplate = new CfnAssessmentTemplate(stack, 'MyAssessmentTemplate', {
20+
const cfnAssessmentTemplate = new CfnAssessmentTemplate(stack, 'MyAssessmentTemplate', {
2121
assessmentTargetArn: assessmentTarget.attrArn,
2222
durationInSeconds: 3600,
23-
// https://docs.aws.amazon.com/inspector/v1/userguide/inspector_rules-arns.html#us-east-1
2423
rulesPackageArns: ['arn:aws:inspector:us-east-1:316112463485:rulespackage/0-gEjTy7T7'],
2524
});
25+
const assessmentTemplate = AssessmentTemplate.fromCfnAssessmentTemplate(stack, 'AssessmentTemplate', cfnAssessmentTemplate);
2626

2727
new scheduler.Schedule(stack, 'Schedule', {
2828
schedule: scheduler.ScheduleExpression.rate(cdk.Duration.minutes(10)),
@@ -36,10 +36,10 @@ const integrationTest = new IntegTest(app, 'integrationtest-inspector-start-asse
3636

3737
// Verifies that the assessment run by the scheduler
3838
integrationTest.assertions.awsApiCall('Inspector', 'listAssessmentRuns', {
39-
AssessmentTemplateArns: [assessmentTemplate.attrArn],
39+
AssessmentTemplateArns: [assessmentTemplate.assessmentTemplateArn],
4040
}).assertAtPath(
4141
'assessmentRunArns.0',
42-
ExpectedResult.stringLikeRegexp(assessmentTemplate.attrArn),
42+
ExpectedResult.stringLikeRegexp(assessmentTemplate.assessmentTemplateArn),
4343
).waitForAssertions({
4444
interval: cdk.Duration.seconds(30),
4545
totalTimeout: cdk.Duration.minutes(10),

0 commit comments

Comments
 (0)
Failed to load comments.