Skip to content

Commit 9e9cc27

Browse files
authored
feat(apprunner): add ObservabilityConfiguration for AppRunner Service (#30359)
### Issue # (if applicable) Closes #22985 . ### Reason for this change At the moment, L2 Construct does not support a tracing setting for the AppRunner Service. ### Description of changes * Add `ObservabilityConfiguration` Class * Add `observabilityConfiguration` property to the `Service` Class ### Description of how you validated changes Add unit tests and integ tests. ### 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) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent 6ef7c67 commit 9e9cc27

15 files changed

+914
-0
lines changed

packages/@aws-cdk/aws-apprunner-alpha/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,3 +296,22 @@ new apprunner.Service(this, 'Service', {
296296
}),
297297
});
298298
```
299+
300+
## Observability Configuration
301+
302+
To associate an App Runner service with a custom observability configuration, use the `observabilityConfiguration` property.
303+
304+
```ts
305+
const observabilityConfiguration = new apprunner.ObservabilityConfiguration(this, 'ObservabilityConfiguration', {
306+
observabilityConfigurationName: 'MyObservabilityConfiguration',
307+
traceConfigurationVendor: apprunner.TraceConfigurationVendor.AWSXRAY,
308+
});
309+
310+
new apprunner.Service(this, 'DemoService', {
311+
source: apprunner.Source.fromEcrPublic({
312+
imageConfiguration: { port: 8000 },
313+
imageIdentifier: 'public.ecr.aws/aws-containers/hello-app-runner:latest',
314+
}),
315+
observabilityConfiguration,
316+
});
317+
```
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// AWS::AppRunner CloudFormation Resources:
22
export * from './auto-scaling-configuration';
3+
export * from './observability-configuration';
34
export * from './service';
45
export * from './vpc-connector';
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
import * as cdk from 'aws-cdk-lib/core';
2+
import { Construct } from 'constructs';
3+
import { CfnObservabilityConfiguration } from 'aws-cdk-lib/aws-apprunner';
4+
5+
/**
6+
* The implementation provider chosen for tracing App Runner services
7+
*
8+
* @see https://docs.aws.amazon.com/apprunner/latest/dg/monitor.html
9+
*/
10+
export enum TraceConfigurationVendor {
11+
/**
12+
* Tracing (X-Ray)
13+
*/
14+
AWSXRAY = 'AWSXRAY',
15+
}
16+
17+
/**
18+
* Properties of the AppRunner Observability configuration
19+
*/
20+
export interface ObservabilityConfigurationProps {
21+
/**
22+
* The name for the ObservabilityConfiguration.
23+
*
24+
* @default - a name generated by CloudFormation
25+
*/
26+
readonly observabilityConfigurationName?: string;
27+
28+
/**
29+
* The implementation provider chosen for tracing App Runner services.
30+
*/
31+
readonly traceConfigurationVendor: TraceConfigurationVendor;
32+
}
33+
34+
/**
35+
* Attributes for the App Runner Observability configuration
36+
*/
37+
export interface ObservabilityConfigurationAttributes {
38+
/**
39+
* The name of the Observability configuration.
40+
*/
41+
readonly observabilityConfigurationName: string;
42+
43+
/**
44+
* The revision of the Observability configuration.
45+
*/
46+
readonly observabilityConfigurationRevision: number;
47+
}
48+
49+
/**
50+
* Represents the App Runner Observability configuration.
51+
*/
52+
export interface IObservabilityConfiguration extends cdk.IResource {
53+
/**
54+
* The Name of the Observability configuration.
55+
* @attribute
56+
*/
57+
readonly observabilityConfigurationName: string;
58+
59+
/**
60+
* The ARN of the Observability configuration.
61+
* @attribute
62+
*/
63+
readonly observabilityConfigurationArn: string;
64+
65+
/**
66+
* The revision of the Observability configuration.
67+
* @attribute
68+
*/
69+
readonly observabilityConfigurationRevision: number;
70+
}
71+
72+
/**
73+
* The App Runner Observability configuration
74+
*
75+
* @resource AWS::AppRunner::ObservabilityConfiguration
76+
*/
77+
export class ObservabilityConfiguration extends cdk.Resource implements IObservabilityConfiguration {
78+
/**
79+
* Imports an App Runner Observability Configuration from attributes.
80+
*/
81+
public static fromObservabilityConfigurationAttributes(scope: Construct, id: string,
82+
attrs: ObservabilityConfigurationAttributes): IObservabilityConfiguration {
83+
const observabilityConfigurationName = attrs.observabilityConfigurationName;
84+
const observabilityConfigurationRevision = attrs.observabilityConfigurationRevision;
85+
86+
class Import extends cdk.Resource implements IObservabilityConfiguration {
87+
public readonly observabilityConfigurationName = observabilityConfigurationName;
88+
public readonly observabilityConfigurationRevision = observabilityConfigurationRevision;
89+
public readonly observabilityConfigurationArn = cdk.Stack.of(this).formatArn({
90+
resource: 'observabilityconfiguration',
91+
service: 'apprunner',
92+
resourceName: `${attrs.observabilityConfigurationName}/${attrs.observabilityConfigurationRevision}`,
93+
});
94+
}
95+
96+
return new Import(scope, id);
97+
}
98+
99+
/**
100+
* Imports an App Runner Observability Configuration from its ARN
101+
*/
102+
public static fromArn(scope: Construct, id: string, observabilityConfigurationArn: string): IObservabilityConfiguration {
103+
const resourceParts = cdk.Fn.split('/', observabilityConfigurationArn);
104+
105+
if (!resourceParts || resourceParts.length < 3) {
106+
throw new Error(`Unexpected ARN format: ${observabilityConfigurationArn}`);
107+
}
108+
109+
const observabilityConfigurationName = cdk.Fn.select(0, resourceParts);
110+
const observabilityConfigurationRevision = Number(cdk.Fn.select(1, resourceParts));
111+
112+
class Import extends cdk.Resource implements IObservabilityConfiguration {
113+
public readonly observabilityConfigurationName = observabilityConfigurationName;
114+
public readonly observabilityConfigurationRevision = observabilityConfigurationRevision;
115+
public readonly observabilityConfigurationArn = observabilityConfigurationArn;
116+
}
117+
118+
return new Import(scope, id);
119+
}
120+
121+
/**
122+
* The ARN of the Observability configuration.
123+
* @attribute
124+
*/
125+
readonly observabilityConfigurationArn: string;
126+
127+
/**
128+
* The revision of the Observability configuration.
129+
* @attribute
130+
*/
131+
readonly observabilityConfigurationRevision: number;
132+
133+
/**
134+
* The name of the Observability configuration.
135+
* @attribute
136+
*/
137+
readonly observabilityConfigurationName: string;
138+
139+
public constructor(scope: Construct, id: string, props: ObservabilityConfigurationProps) {
140+
super(scope, id, {
141+
physicalName: props.observabilityConfigurationName,
142+
});
143+
144+
if (
145+
props.observabilityConfigurationName !== undefined &&
146+
!cdk.Token.isUnresolved(props.observabilityConfigurationName) &&
147+
!/^[A-Za-z0-9][A-Za-z0-9\-_]{3,31}$/.test(props.observabilityConfigurationName)
148+
) {
149+
throw new Error(`observabilityConfigurationName must match the \`^[A-Za-z0-9][A-Za-z0-9\-_]{3,31}$\` pattern, got ${props.observabilityConfigurationName}`);
150+
}
151+
152+
const resource = new CfnObservabilityConfiguration(this, 'Resource', {
153+
observabilityConfigurationName: props.observabilityConfigurationName,
154+
traceConfiguration: {
155+
vendor: props.traceConfigurationVendor,
156+
},
157+
});
158+
159+
this.observabilityConfigurationArn = resource.attrObservabilityConfigurationArn;
160+
this.observabilityConfigurationRevision = resource.attrObservabilityConfigurationRevision;
161+
this.observabilityConfigurationName = resource.ref;
162+
}
163+
}

packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Construct } from 'constructs';
1010
import { CfnService } from 'aws-cdk-lib/aws-apprunner';
1111
import { IVpcConnector } from './vpc-connector';
1212
import { IAutoScalingConfiguration } from './auto-scaling-configuration';
13+
import { IObservabilityConfiguration } from './observability-configuration';
1314

1415
/**
1516
* The image repository types
@@ -743,6 +744,14 @@ export interface ServiceProps {
743744
* @default - IpAddressType.IPV4
744745
*/
745746
readonly ipAddressType?: IpAddressType;
747+
748+
/**
749+
* Settings for an App Runner observability configuration.
750+
*
751+
* @default - no observability configuration resource is associated with the service.
752+
*/
753+
readonly observabilityConfiguration?: IObservabilityConfiguration;
754+
746755
}
747756

748757
/**
@@ -1296,6 +1305,10 @@ export class Service extends cdk.Resource implements iam.IGrantable {
12961305
healthCheckConfiguration: this.props.healthCheck ?
12971306
this.props.healthCheck.bind() :
12981307
undefined,
1308+
observabilityConfiguration: props.observabilityConfiguration ? {
1309+
observabilityEnabled: true,
1310+
observabilityConfigurationArn: props.observabilityConfiguration.observabilityConfigurationArn,
1311+
} : undefined,
12991312
});
13001313

13011314
// grant required privileges for the role

packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.assets.json

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.template.json

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/cdk.out

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ-apprunner-observability-configuration.assets.json

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)