From a4e11b44b4f67704c83b1146ce809815cc5ab152 Mon Sep 17 00:00:00 2001 From: maz Date: Tue, 28 May 2024 19:04:45 +0900 Subject: [PATCH 01/18] add ObservabilityConfiguration for AppRunner Service --- .../@aws-cdk/aws-apprunner-alpha/README.md | 23 +- .../@aws-cdk/aws-apprunner-alpha/lib/index.ts | 1 + .../lib/observability-configuration.ts | 135 ++++++++++ .../aws-apprunner-alpha/lib/service.ts | 14 +- ...efaultTestDeployAssertFEB7E279.assets.json | 19 ++ ...aultTestDeployAssertFEB7E279.template.json | 36 +++ .../cdk.out | 1 + ...er-observability-configuration.assets.json | 19 ++ ...-observability-configuration.template.json | 120 +++++++++ .../integ.json | 12 + .../manifest.json | 131 ++++++++++ .../tree.json | 235 ++++++++++++++++++ ...teg.service-observability-configuration.ts | 31 +++ .../test/obserbability-configuration.test.ts | 38 +++ .../aws-apprunner-alpha/test/service.test.ts | 55 +++- 15 files changed, 866 insertions(+), 4 deletions(-) create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.assets.json create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.template.json create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/cdk.out create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ-apprunner-observability-configuration.assets.json create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ-apprunner-observability-configuration.template.json create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ.json create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/manifest.json create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/tree.json create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.ts create mode 100644 packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts diff --git a/packages/@aws-cdk/aws-apprunner-alpha/README.md b/packages/@aws-cdk/aws-apprunner-alpha/README.md index 1cc9363c8c139..8307ae8f4f0c9 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/README.md +++ b/packages/@aws-cdk/aws-apprunner-alpha/README.md @@ -32,7 +32,7 @@ The `Service` construct allows you to create AWS App Runner services with `ECR P - `Source.fromEcr()` - To define the source repository from `ECR`. - `Source.fromEcrPublic()` - To define the source repository from `ECR Public`. - `Source.fromGitHub()` - To define the source repository from the `Github repository`. -- `Source.fromAsset()` - To define the source from local asset directory. +- `Source.fromAsset()` - To define the source from local asset directory. The `Service` construct implements `IGrantable`. @@ -183,7 +183,7 @@ new apprunner.Service(this, 'Service', { ## Secrets Manager To include environment variables integrated with AWS Secrets Manager, use the `environmentSecrets` attribute. -You can use the `addSecret` method from the App Runner `Service` class to include secrets from outside the +You can use the `addSecret` method from the App Runner `Service` class to include secrets from outside the service definition. ```ts @@ -237,3 +237,22 @@ new apprunner.Service(this, 'Service', { }), }); ``` + +## Observability Configuration + +To associate an App Runner service with a custom Observability Configuration, define `observabilityConfiguration` for the service. + +```ts +const observabilityConfiguration = new apprunner.ObservabilityConfiguration(this, 'ObservabilityConfiguration', { + observabilityConfigurationName: 'MyObservabilityConfiguration', + vendor: apprunner.Vendor.AWSXRAY, +}); + +new apprunner.Service(this, 'DemoService', { + source: apprunner.Source.fromEcrPublic({ + imageConfiguration: { port: 8000 }, + imageIdentifier: 'public.ecr.aws/aws-containers/hello-app-runner:latest', + }), + observabilityConfiguration, +}); +``` diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/index.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/index.ts index e061d5b7ecf80..072abf0e89c03 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/index.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/index.ts @@ -1,3 +1,4 @@ // AWS::AppRunner CloudFormation Resources: export * from './service'; export * from './vpc-connector'; +export * from './observability-configuration'; \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts new file mode 100644 index 0000000000000..d8bcc299234db --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -0,0 +1,135 @@ +import * as cdk from 'aws-cdk-lib/core'; +import { Construct } from 'constructs'; +import { CfnObservabilityConfiguration } from 'aws-cdk-lib/aws-apprunner'; + +/** + * The implementation provider chosen for tracing App Runner services + */ +export enum Vendor { + /** + * AWS X-RAY + */ + AWSXRAY = 'AWSXRAY', +} + +/** + * Properties of the AppRunner Observability configuration + */ +export interface ObservabilityConfigurationProps { + /** + * The name for the ObservabilityConfiguration. + * + * @default - a name generated by CloudFormation + */ + readonly observabilityConfigurationName?: string; + + /** + * The implementation provider chosen for tracing App Runner services. + * + * @default Vendor.AWSXRAY + */ + readonly vendor?: Vendor; +} + +/** + * Attributes for the App Runner Observability configuration + */ +export interface ObservabilityConfigurationAttributes { + /** + * The name of the Observability configuration. + */ + readonly observabilityConfigurationName: string; + + /** + * The ARN of the Observability configuration. + */ + readonly observabilityConfigurationArn: string; + + /** + * The revision of the Observability configuration. + */ + readonly observabilityConfigurationRevision: number; +} + +/** + * Represents the App Runner Observability configuration. + */ +export interface IObservabilityConfiguration extends cdk.IResource { + /** + * The Name of the Observability configuration. + * @attribute + */ + readonly observabilityConfigurationName: string; + + /** + * The ARN of the Observability configuration. + * @attribute + */ + readonly observabilityConfigurationArn: string; + + /** + * The revision of the Observability configuration. + * @attribute + */ + readonly observabilityConfigurationRevision: number; +} + +/** + * The App Runner Observability configuration + * + * @resource AWS::AppRunner::ObservabilityConfiguration + */ +export class ObservabilityConfiguration extends cdk.Resource implements IObservabilityConfiguration { + /** + * Import from Observability configuration attributes. + */ + public static fromObservabilityConfigurationAttributes(scope: Construct, id: string, + attrs: ObservabilityConfigurationAttributes): IObservabilityConfiguration { + const observabilityConfigurationArn = attrs.observabilityConfigurationArn; + const observabilityConfigurationName = attrs.observabilityConfigurationName; + const observabilityConfigurationRevision = attrs.observabilityConfigurationRevision; + + class Import extends cdk.Resource { + public readonly observabilityConfigurationArn = observabilityConfigurationArn + public readonly observabilityConfigurationName = observabilityConfigurationName + public readonly observabilityConfigurationRevision = observabilityConfigurationRevision + } + + return new Import(scope, id); + } + + /** + * The ARN of the Observability configuration. + * @attribute + */ + readonly observabilityConfigurationArn: string; + + /** + * The revision of the Observability configuration. + * @attribute + */ + readonly observabilityConfigurationRevision: number; + + /** + * The name of the Observability configuration. + * @attribute + */ + readonly observabilityConfigurationName: string; + + public constructor(scope: Construct, id: string, props: ObservabilityConfigurationProps = {}) { + super(scope, id, { + physicalName: props.observabilityConfigurationName, + }); + + const resource = new CfnObservabilityConfiguration(this, 'Resource', { + observabilityConfigurationName: props.observabilityConfigurationName, + traceConfiguration: { + vendor: props.vendor ?? Vendor.AWSXRAY, + }, + }); + + this.observabilityConfigurationArn = resource.attrObservabilityConfigurationArn; + this.observabilityConfigurationRevision = resource.attrObservabilityConfigurationRevision; + this.observabilityConfigurationName = resource.ref; + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts index 9564bbae18cf3..978dd1d027610 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts @@ -8,6 +8,7 @@ import { Lazy } from 'aws-cdk-lib/core'; import { Construct } from 'constructs'; import { CfnService } from 'aws-cdk-lib/aws-apprunner'; import { IVpcConnector } from './vpc-connector'; +import { IObservabilityConfiguration } from './observability-configuration'; /** * The image repository types @@ -79,7 +80,7 @@ export class Cpu { * * @param unit The unit of CPU. */ - private constructor(public readonly unit: string) {} + private constructor(public readonly unit: string) { } } /** @@ -715,6 +716,13 @@ export interface ServiceProps { * @default - no health check configuration */ readonly healthCheck?: HealthCheck; + + /** + * Settings for an App Runner tracing feature. + * + * @default - Not enable tracing + */ + readonly observabilityConfiguration?: IObservabilityConfiguration; } /** @@ -1248,6 +1256,10 @@ export class Service extends cdk.Resource implements iam.IGrantable { healthCheckConfiguration: this.props.healthCheck ? this.props.healthCheck.bind() : undefined, + observabilityConfiguration: props.observabilityConfiguration ? { + observabilityEnabled: true, + observabilityConfigurationArn: props.observabilityConfiguration?.observabilityConfigurationArn, + } : undefined, }); // grant required privileges for the role diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.assets.json b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.assets.json new file mode 100644 index 0000000000000..e9f8f8a38b121 --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.assets.json @@ -0,0 +1,19 @@ +{ + "version": "36.0.0", + "files": { + "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { + "source": { + "path": "AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.template.json b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.template.json new file mode 100644 index 0000000000000..ad9d0fb73d1dd --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.template.json @@ -0,0 +1,36 @@ +{ + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/cdk.out b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/cdk.out new file mode 100644 index 0000000000000..1f0068d32659a --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/cdk.out @@ -0,0 +1 @@ +{"version":"36.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ-apprunner-observability-configuration.assets.json b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ-apprunner-observability-configuration.assets.json new file mode 100644 index 0000000000000..eac050d6296f7 --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ-apprunner-observability-configuration.assets.json @@ -0,0 +1,19 @@ +{ + "version": "36.0.0", + "files": { + "839ca74bb662f9fc4cef96d00bbc37a8739def22f31ef235eb3dc66132b90e9c": { + "source": { + "path": "integ-apprunner-observability-configuration.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "839ca74bb662f9fc4cef96d00bbc37a8739def22f31ef235eb3dc66132b90e9c.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ-apprunner-observability-configuration.template.json b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ-apprunner-observability-configuration.template.json new file mode 100644 index 0000000000000..e98b564b36943 --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ-apprunner-observability-configuration.template.json @@ -0,0 +1,120 @@ +{ + "Resources": { + "ObservabilityConfiguration68CE4C7A": { + "Type": "AWS::AppRunner::ObservabilityConfiguration", + "Properties": { + "TraceConfiguration": { + "Vendor": "AWSXRAY" + } + } + }, + "ServiceInstanceRoleDFA90CEC": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "tasks.apprunner.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "ServiceDBC79909": { + "Type": "AWS::AppRunner::Service", + "Properties": { + "InstanceConfiguration": { + "InstanceRoleArn": { + "Fn::GetAtt": [ + "ServiceInstanceRoleDFA90CEC", + "Arn" + ] + } + }, + "NetworkConfiguration": { + "EgressConfiguration": { + "EgressType": "DEFAULT" + } + }, + "ObservabilityConfiguration": { + "ObservabilityConfigurationArn": { + "Fn::GetAtt": [ + "ObservabilityConfiguration68CE4C7A", + "ObservabilityConfigurationArn" + ] + }, + "ObservabilityEnabled": true + }, + "ServiceName": "service", + "SourceConfiguration": { + "AuthenticationConfiguration": {}, + "AutoDeploymentsEnabled": false, + "ImageRepository": { + "ImageConfiguration": { + "Port": "8000" + }, + "ImageIdentifier": "public.ecr.aws/aws-containers/hello-app-runner:latest", + "ImageRepositoryType": "ECR_PUBLIC" + } + } + } + } + }, + "Outputs": { + "URL": { + "Value": { + "Fn::Join": [ + "", + [ + "https://", + { + "Fn::GetAtt": [ + "ServiceDBC79909", + "ServiceUrl" + ] + } + ] + ] + } + } + }, + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ.json b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ.json new file mode 100644 index 0000000000000..bdeee25d506b6 --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/integ.json @@ -0,0 +1,12 @@ +{ + "version": "36.0.0", + "testCases": { + "AppRunnerObservabilityConfiguration/DefaultTest": { + "stacks": [ + "integ-apprunner-observability-configuration" + ], + "assertionStack": "AppRunnerObservabilityConfiguration/DefaultTest/DeployAssert", + "assertionStackName": "AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/manifest.json b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/manifest.json new file mode 100644 index 0000000000000..913b385e121a3 --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/manifest.json @@ -0,0 +1,131 @@ +{ + "version": "36.0.0", + "artifacts": { + "integ-apprunner-observability-configuration.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "integ-apprunner-observability-configuration.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "integ-apprunner-observability-configuration": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "integ-apprunner-observability-configuration.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/839ca74bb662f9fc4cef96d00bbc37a8739def22f31ef235eb3dc66132b90e9c.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "integ-apprunner-observability-configuration.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "integ-apprunner-observability-configuration.assets" + ], + "metadata": { + "/integ-apprunner-observability-configuration/ObservabilityConfiguration/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "ObservabilityConfiguration68CE4C7A" + } + ], + "/integ-apprunner-observability-configuration/Service/InstanceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "ServiceInstanceRoleDFA90CEC" + } + ], + "/integ-apprunner-observability-configuration/Service/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "ServiceDBC79909" + } + ], + "/integ-apprunner-observability-configuration/URL": [ + { + "type": "aws:cdk:logicalId", + "data": "URL" + } + ], + "/integ-apprunner-observability-configuration/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/integ-apprunner-observability-configuration/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "integ-apprunner-observability-configuration" + }, + "AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.template.json", + "terminationProtection": false, + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "AppRunnerObservabilityConfigurationDefaultTestDeployAssertFEB7E279.assets" + ], + "metadata": { + "/AppRunnerObservabilityConfiguration/DefaultTest/DeployAssert/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/AppRunnerObservabilityConfiguration/DefaultTest/DeployAssert/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "AppRunnerObservabilityConfiguration/DefaultTest/DeployAssert" + }, + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/tree.json b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/tree.json new file mode 100644 index 0000000000000..af1a3f2a658e9 --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.js.snapshot/tree.json @@ -0,0 +1,235 @@ +{ + "version": "tree-0.1", + "tree": { + "id": "App", + "path": "", + "children": { + "integ-apprunner-observability-configuration": { + "id": "integ-apprunner-observability-configuration", + "path": "integ-apprunner-observability-configuration", + "children": { + "ObservabilityConfiguration": { + "id": "ObservabilityConfiguration", + "path": "integ-apprunner-observability-configuration/ObservabilityConfiguration", + "children": { + "Resource": { + "id": "Resource", + "path": "integ-apprunner-observability-configuration/ObservabilityConfiguration/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::AppRunner::ObservabilityConfiguration", + "aws:cdk:cloudformation:props": { + "traceConfiguration": { + "vendor": "AWSXRAY" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apprunner.CfnObservabilityConfiguration", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "Service": { + "id": "Service", + "path": "integ-apprunner-observability-configuration/Service", + "children": { + "InstanceRole": { + "id": "InstanceRole", + "path": "integ-apprunner-observability-configuration/Service/InstanceRole", + "children": { + "ImportInstanceRole": { + "id": "ImportInstanceRole", + "path": "integ-apprunner-observability-configuration/Service/InstanceRole/ImportInstanceRole", + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "integ-apprunner-observability-configuration/Service/InstanceRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "tasks.apprunner.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.CfnRole", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_iam.Role", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "integ-apprunner-observability-configuration/Service/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::AppRunner::Service", + "aws:cdk:cloudformation:props": { + "instanceConfiguration": { + "instanceRoleArn": { + "Fn::GetAtt": [ + "ServiceInstanceRoleDFA90CEC", + "Arn" + ] + } + }, + "networkConfiguration": { + "egressConfiguration": { + "egressType": "DEFAULT" + } + }, + "observabilityConfiguration": { + "observabilityEnabled": true, + "observabilityConfigurationArn": { + "Fn::GetAtt": [ + "ObservabilityConfiguration68CE4C7A", + "ObservabilityConfigurationArn" + ] + } + }, + "serviceName": "service", + "sourceConfiguration": { + "authenticationConfiguration": {}, + "autoDeploymentsEnabled": false, + "imageRepository": { + "imageConfiguration": { + "port": "8000" + }, + "imageIdentifier": "public.ecr.aws/aws-containers/hello-app-runner:latest", + "imageRepositoryType": "ECR_PUBLIC" + } + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.aws_apprunner.CfnService", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Resource", + "version": "0.0.0" + } + }, + "URL": { + "id": "URL", + "path": "integ-apprunner-observability-configuration/URL", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnOutput", + "version": "0.0.0" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "integ-apprunner-observability-configuration/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "integ-apprunner-observability-configuration/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" + } + }, + "AppRunnerObservabilityConfiguration": { + "id": "AppRunnerObservabilityConfiguration", + "path": "AppRunnerObservabilityConfiguration", + "children": { + "DefaultTest": { + "id": "DefaultTest", + "path": "AppRunnerObservabilityConfiguration/DefaultTest", + "children": { + "Default": { + "id": "Default", + "path": "AppRunnerObservabilityConfiguration/DefaultTest/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + }, + "DeployAssert": { + "id": "DeployAssert", + "path": "AppRunnerObservabilityConfiguration/DefaultTest/DeployAssert", + "children": { + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "AppRunnerObservabilityConfiguration/DefaultTest/DeployAssert/BootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "AppRunnerObservabilityConfiguration/DefaultTest/DeployAssert/CheckBootstrapVersion", + "constructInfo": { + "fqn": "aws-cdk-lib.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.Stack", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTestCase", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests-alpha.IntegTest", + "version": "0.0.0" + } + }, + "Tree": { + "id": "Tree", + "path": "Tree", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0" + } + } + }, + "constructInfo": { + "fqn": "aws-cdk-lib.App", + "version": "0.0.0" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.ts new file mode 100644 index 0000000000000..9b16e2f3d2c37 --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.ts @@ -0,0 +1,31 @@ +import * as cdk from 'aws-cdk-lib'; +import { Service, Source, ObservabilityConfiguration, Vendor } from '../lib'; +import * as integ from '@aws-cdk/integ-tests-alpha'; + +const app = new cdk.App(); + +const stack = new cdk.Stack(app, 'integ-apprunner-observability-configuration'); + +const observabilityConfiguration = new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { + vendor: Vendor.AWSXRAY, +}); + +const service = new Service(stack, 'Service', { + serviceName: 'service', + source: Source.fromEcrPublic({ + imageConfiguration: { + port: 8000, + }, + imageIdentifier: 'public.ecr.aws/aws-containers/hello-app-runner:latest', + }), + autoDeploymentsEnabled: false, + observabilityConfiguration, +}); + +new cdk.CfnOutput(stack, 'URL', { value: `https://${service.serviceUrl}` }); + +new integ.IntegTest(app, 'AppRunnerObservabilityConfiguration', { + testCases: [stack], +}); + +app.synth(); diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts b/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts new file mode 100644 index 0000000000000..dfcf73ff02832 --- /dev/null +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts @@ -0,0 +1,38 @@ +import { Match, Template } from 'aws-cdk-lib/assertions'; +import * as cdk from 'aws-cdk-lib'; +import { ObservabilityConfiguration, Vendor } from '../lib'; + +let stack: cdk.Stack; +beforeEach(() => { + stack = new cdk.Stack(); +}); + +test('create a Observability Configuration with all properties', () => { + // WHEN + new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { + observabilityConfigurationName: 'MyObservabilityConfiguration', + vendor: Vendor.AWSXRAY, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::ObservabilityConfiguration', { + ObservabilityConfigurationName: 'MyObservabilityConfiguration', + TraceConfiguration: { + Vendor: 'AWSXRAY', + }, + }); +}); + +test('create a Observability Configuration without all properties', () => { + // WHEN + new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::ObservabilityConfiguration', { + ObservabilityConfigurationName: Match.absent(), + TraceConfiguration: { + Vendor: 'AWSXRAY', + }, + }); +}); diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts b/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts index d4ef80d552bd1..df99a840012da 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts @@ -1579,4 +1579,57 @@ test('timeout must be less than or equal to 20 in healthCheck', () => { }), }); }).toThrow('timeout must be between 1 and 20 seconds, got 21'); -}); \ No newline at end of file +}); + +test('create a service with a Observability Configuration)', () => { + // GIVEN + const app = new cdk.App(); + const stack = new cdk.Stack(app, 'demo-stack'); + const observabilityConfiguration = new apprunner.ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { + observabilityConfigurationName: 'MyObservabilityConfiguration', + vendor: apprunner.Vendor.AWSXRAY, + }); + + // WHEN + new apprunner.Service(stack, 'DemoService', { + source: apprunner.Source.fromEcrPublic({ + imageConfiguration: { port: 8000 }, + imageIdentifier: 'public.ecr.aws/aws-containers/hello-app-runner:latest', + }), + observabilityConfiguration, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::ObservabilityConfiguration', { + ObservabilityConfigurationName: 'MyObservabilityConfiguration', + TraceConfiguration: { + Vendor: 'AWSXRAY', + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::Service', { + ObservabilityConfiguration: { + ObservabilityEnabled: true, + ObservabilityConfigurationArn: stack.resolve(observabilityConfiguration.observabilityConfigurationArn), + }, + }); +}); + +test('create a service without a Observability Configuration)', () => { + // GIVEN + const app = new cdk.App(); + const stack = new cdk.Stack(app, 'demo-stack'); + + // WHEN + new apprunner.Service(stack, 'DemoService', { + source: apprunner.Source.fromEcrPublic({ + imageConfiguration: { port: 8000 }, + imageIdentifier: 'public.ecr.aws/aws-containers/hello-app-runner:latest', + }), + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::Service', { + ObservabilityConfiguration: Match.absent(), + }); +}); From e73b10d6e8a6eae90bd5f1a2d58c57734885bfe1 Mon Sep 17 00:00:00 2001 From: maz Date: Wed, 29 May 2024 08:51:42 +0900 Subject: [PATCH 02/18] feat: add fromArn method --- .../lib/observability-configuration.ts | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index d8bcc299234db..ba644d35ddabf 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -81,7 +81,7 @@ export interface IObservabilityConfiguration extends cdk.IResource { */ export class ObservabilityConfiguration extends cdk.Resource implements IObservabilityConfiguration { /** - * Import from Observability configuration attributes. + * Imports an App Runner Observability Configuration from attributes. */ public static fromObservabilityConfigurationAttributes(scope: Construct, id: string, attrs: ObservabilityConfigurationAttributes): IObservabilityConfiguration { @@ -98,6 +98,28 @@ export class ObservabilityConfiguration extends cdk.Resource implements IObserva return new Import(scope, id); } + /** + * Imports an App Runner Observability Configuration from its ARN + */ + public static fromArn(scope: Construct, id: string, observabilityConfigurationArn: string): IObservabilityConfiguration { + const arn = cdk.Stack.of(scope).splitArn(observabilityConfigurationArn, cdk.ArnFormat.SLASH_RESOURCE_NAME); + + const resourceParts = arn.resourceName?.split('/'); + + if (!resourceParts || resourceParts.length < 3) { + throw new Error(`Unexpected ARN format: ${observabilityConfigurationArn}`); + } + + const observabilityConfigurationName = resourceParts[0]; + const observabilityConfigurationRevision = parseInt(resourceParts[1]); + + return ObservabilityConfiguration.fromObservabilityConfigurationAttributes(scope, id, { + observabilityConfigurationArn, + observabilityConfigurationName, + observabilityConfigurationRevision, + }); + } + /** * The ARN of the Observability configuration. * @attribute From 10277c4dc139272514f56d96d1579b49c7e6aa4a Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Sun, 2 Jun 2024 00:52:52 +0900 Subject: [PATCH 03/18] Update packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts Co-authored-by: Luca Pizzini --- packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts index 91291d8e69845..c6b8a4d1d95b1 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts @@ -726,9 +726,9 @@ export interface ServiceProps { readonly kmsKey?: kms.IKey; /** - * Settings for an App Runner tracing feature. + * Settings for an App Runner observability configuration. * - * @default - Not enable tracing + * @default - no observability configuration resource is associated with the service. */ readonly observabilityConfiguration?: IObservabilityConfiguration; } From 4af4868d1fc1e4b31181de165e9d42d528b21c44 Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Sun, 2 Jun 2024 00:53:03 +0900 Subject: [PATCH 04/18] Update packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts Co-authored-by: Luca Pizzini --- packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts index c6b8a4d1d95b1..66db7a4cc0ddb 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts @@ -1269,7 +1269,7 @@ export class Service extends cdk.Resource implements iam.IGrantable { undefined, observabilityConfiguration: props.observabilityConfiguration ? { observabilityEnabled: true, - observabilityConfigurationArn: props.observabilityConfiguration?.observabilityConfigurationArn, + observabilityConfigurationArn: props.observabilityConfiguration.observabilityConfigurationArn, } : undefined, }); From c532781f319f2d09725891366b11b6c6f802cfe1 Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Sun, 2 Jun 2024 00:53:11 +0900 Subject: [PATCH 05/18] Update packages/@aws-cdk/aws-apprunner-alpha/README.md Co-authored-by: Luca Pizzini --- packages/@aws-cdk/aws-apprunner-alpha/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/README.md b/packages/@aws-cdk/aws-apprunner-alpha/README.md index 475d5516ff1ec..16f5cc196b7a4 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/README.md +++ b/packages/@aws-cdk/aws-apprunner-alpha/README.md @@ -258,7 +258,7 @@ new apprunner.Service(this, 'Service', { ## Observability Configuration -To associate an App Runner service with a custom Observability Configuration, define `observabilityConfiguration` for the service. +To associate an App Runner service with a custom observability configuration, use the `observabilityConfiguration` property. ```ts const observabilityConfiguration = new apprunner.ObservabilityConfiguration(this, 'ObservabilityConfiguration', { From 8a7f2f776e510552f4e1d774736a46fd3dded8cc Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Sun, 2 Jun 2024 00:53:20 +0900 Subject: [PATCH 06/18] Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts Co-authored-by: Luca Pizzini --- .../aws-apprunner-alpha/lib/observability-configuration.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index ba644d35ddabf..0c26204643546 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -121,9 +121,9 @@ export class ObservabilityConfiguration extends cdk.Resource implements IObserva } /** - * The ARN of the Observability configuration. - * @attribute - */ + * The ARN of the Observability configuration. + * @attribute + */ readonly observabilityConfigurationArn: string; /** From b0cc774e7c7f9efdc7d6d82129c182bb25eee0c8 Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Sun, 2 Jun 2024 00:53:28 +0900 Subject: [PATCH 07/18] Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts Co-authored-by: Luca Pizzini --- .../aws-apprunner-alpha/lib/observability-configuration.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index 0c26204643546..44c28f85e3375 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -133,9 +133,9 @@ export class ObservabilityConfiguration extends cdk.Resource implements IObserva readonly observabilityConfigurationRevision: number; /** - * The name of the Observability configuration. - * @attribute - */ + * The name of the Observability configuration. + * @attribute + */ readonly observabilityConfigurationName: string; public constructor(scope: Construct, id: string, props: ObservabilityConfigurationProps = {}) { From 71da22222e06dd22ab6eec145a405444c67e3b82 Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Sun, 2 Jun 2024 00:53:40 +0900 Subject: [PATCH 08/18] Update packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts Co-authored-by: Luca Pizzini --- packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts b/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts index 1980053d16057..6a728d3e27f4b 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts @@ -1606,7 +1606,7 @@ test('create a service with a customer managed key)', () => { }); }); -test('create a service with a Observability Configuration)', () => { +test('create a service with a Observability Configuration', () => { // GIVEN const app = new cdk.App(); const stack = new cdk.Stack(app, 'demo-stack'); From b93cd9be1b87f1c583ea390765adbdbd019b2cfa Mon Sep 17 00:00:00 2001 From: maz Date: Sun, 2 Jun 2024 10:55:23 +0900 Subject: [PATCH 09/18] fix: incorporate review comments --- .../@aws-cdk/aws-apprunner-alpha/lib/index.ts | 2 +- .../lib/observability-configuration.ts | 22 +++++++-- .../test/obserbability-configuration.test.ts | 47 ++++++++++++++++--- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/index.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/index.ts index 072abf0e89c03..ab043e231033a 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/index.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/index.ts @@ -1,4 +1,4 @@ // AWS::AppRunner CloudFormation Resources: +export * from './observability-configuration'; export * from './service'; export * from './vpc-connector'; -export * from './observability-configuration'; \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index 44c28f85e3375..41180788fb22d 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -26,7 +26,9 @@ export interface ObservabilityConfigurationProps { /** * The implementation provider chosen for tracing App Runner services. * - * @default Vendor.AWSXRAY + * You can not attach ObservabilityConfiguration with no vendor to the App Runner Service. + * + * @default - tracing is not enabled for the service */ readonly vendor?: Vendor; } @@ -143,15 +145,25 @@ export class ObservabilityConfiguration extends cdk.Resource implements IObserva physicalName: props.observabilityConfigurationName, }); + if (props.observabilityConfigurationName !== undefined) { + if (props.observabilityConfigurationName.length < 4 || props.observabilityConfigurationName.length > 32) { + throw new Error(`observabilityConfigurationName must be between 4 and 32 characters long, but it has ${props.observabilityConfigurationName.length} characters.`); + } + + if (!/^[A-Za-z0-9][A-Za-z0-9\-_]{3,31}$/.test(props.observabilityConfigurationName)) { + throw new Error(`observabilityConfigurationName ${props.observabilityConfigurationName} must start with a letter or number, and can contain only letters, numbers, hyphens, and underscores.`); + } + } + const resource = new CfnObservabilityConfiguration(this, 'Resource', { observabilityConfigurationName: props.observabilityConfigurationName, - traceConfiguration: { - vendor: props.vendor ?? Vendor.AWSXRAY, - }, + traceConfiguration: props.vendor ? { + vendor: props.vendor, + } : undefined, }); this.observabilityConfigurationArn = resource.attrObservabilityConfigurationArn; this.observabilityConfigurationRevision = resource.attrObservabilityConfigurationRevision; this.observabilityConfigurationName = resource.ref; } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts b/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts index dfcf73ff02832..2dd7604d50a8e 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts @@ -7,22 +7,37 @@ beforeEach(() => { stack = new cdk.Stack(); }); -test('create a Observability Configuration with all properties', () => { +test.each([ + ['MyObservabilityConfiguration'], + ['my-observability-configuration_1'], +])('create a ObservabilityConfiguration with all properties (name: %s)', (observabilityConfigurationName: string) => { // WHEN new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { - observabilityConfigurationName: 'MyObservabilityConfiguration', + observabilityConfigurationName, vendor: Vendor.AWSXRAY, }); // THEN Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::ObservabilityConfiguration', { - ObservabilityConfigurationName: 'MyObservabilityConfiguration', + ObservabilityConfigurationName: observabilityConfigurationName, TraceConfiguration: { Vendor: 'AWSXRAY', }, }); }); +test('create a ObservabilityConfiguration without all properties', () => { + // WHEN + new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::ObservabilityConfiguration', { + ObservabilityConfigurationName: Match.absent(), + TraceConfiguration: Match.absent(), + }); +}); + test('create a Observability Configuration without all properties', () => { // WHEN new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { @@ -31,8 +46,28 @@ test('create a Observability Configuration without all properties', () => { // THEN Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::ObservabilityConfiguration', { ObservabilityConfigurationName: Match.absent(), - TraceConfiguration: { - Vendor: 'AWSXRAY', - }, + TraceConfiguration: Match.absent(), }); }); + +test.each([ + ['tes'], + ['test-observability-configuration-name-over-limitation'], +])('observabilityConfigurationName over length limitation (name: %s)', (observabilityConfigurationName: string) => { + expect(() => { + new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { + observabilityConfigurationName, + }); + }).toThrow(`observabilityConfigurationName must be between 4 and 32 characters long, but it has ${observabilityConfigurationName.length} characters.`); +}); + +test.each([ + ['-test'], + ['test-?'], +])('invalid observabilityConfigurationName (name: %s)', (observabilityConfigurationName: string) => { + expect(() => { + new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { + observabilityConfigurationName, + }); + }).toThrow(`observabilityConfigurationName ${observabilityConfigurationName} must start with a letter or number, and can contain only letters, numbers, hyphens, and underscores.`); +}); From d525912ed072f71ca35515fd2fd0a893fd812507 Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Mon, 3 Jun 2024 00:04:12 +0900 Subject: [PATCH 10/18] Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts Co-authored-by: Luca Pizzini --- .../lib/observability-configuration.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index 41180788fb22d..756ef0a7e6f5d 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -145,14 +145,12 @@ export class ObservabilityConfiguration extends cdk.Resource implements IObserva physicalName: props.observabilityConfigurationName, }); - if (props.observabilityConfigurationName !== undefined) { - if (props.observabilityConfigurationName.length < 4 || props.observabilityConfigurationName.length > 32) { - throw new Error(`observabilityConfigurationName must be between 4 and 32 characters long, but it has ${props.observabilityConfigurationName.length} characters.`); - } - - if (!/^[A-Za-z0-9][A-Za-z0-9\-_]{3,31}$/.test(props.observabilityConfigurationName)) { - throw new Error(`observabilityConfigurationName ${props.observabilityConfigurationName} must start with a letter or number, and can contain only letters, numbers, hyphens, and underscores.`); - } + if ( + props.observabilityConfigurationName !== undefined && + !cdk.Token.isUnresolved(props.observabilityConfigurationName) && + !/^[A-Za-z0-9][A-Za-z0-9\-_]{3,31}$/.test(props.observabilityConfigurationName) + ) { + throw new Error(`observabilityConfigurationName must match the \`^[A-Za-z0-9][A-Za-z0-9\-_]{3,31}$\` pattern, got ${props.observabilityConfigurationName}`); } const resource = new CfnObservabilityConfiguration(this, 'Resource', { From 481242365fdbfd3db9ba76756cb77073a1e5d091 Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Mon, 3 Jun 2024 00:04:38 +0900 Subject: [PATCH 11/18] Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts Co-authored-by: Luca Pizzini --- .../aws-apprunner-alpha/lib/observability-configuration.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index 756ef0a7e6f5d..cc71acc498253 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -4,6 +4,8 @@ import { CfnObservabilityConfiguration } from 'aws-cdk-lib/aws-apprunner'; /** * The implementation provider chosen for tracing App Runner services + * + * @see https://docs.aws.amazon.com/apprunner/latest/dg/monitor.html */ export enum Vendor { /** From d667bb43a5722c0c5911ce95b526f068365e44bc Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Mon, 3 Jun 2024 00:04:54 +0900 Subject: [PATCH 12/18] Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts Co-authored-by: Luca Pizzini --- .../aws-apprunner-alpha/lib/observability-configuration.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index cc71acc498253..da94a4bb8cd34 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -9,7 +9,7 @@ import { CfnObservabilityConfiguration } from 'aws-cdk-lib/aws-apprunner'; */ export enum Vendor { /** - * AWS X-RAY + * Tracing (X-Ray) */ AWSXRAY = 'AWSXRAY', } From f6e9e2c089275926b02fc63bfa1af118a905f5d2 Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Mon, 3 Jun 2024 00:05:02 +0900 Subject: [PATCH 13/18] Update packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts Co-authored-by: Luca Pizzini --- packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts b/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts index 6a728d3e27f4b..993f0481cb559 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts @@ -1640,7 +1640,7 @@ test('create a service with a Observability Configuration', () => { }); }); -test('create a service without a Observability Configuration)', () => { +test('create a service without a Observability Configuration', () => { // GIVEN const app = new cdk.App(); const stack = new cdk.Stack(app, 'demo-stack'); From 2481648859c2c0a1f3ff80e172020a66656d71cc Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Mon, 3 Jun 2024 00:05:52 +0900 Subject: [PATCH 14/18] Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts Co-authored-by: Luca Pizzini --- .../aws-apprunner-alpha/lib/observability-configuration.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index da94a4bb8cd34..27e3400068ea9 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -27,12 +27,8 @@ export interface ObservabilityConfigurationProps { /** * The implementation provider chosen for tracing App Runner services. - * - * You can not attach ObservabilityConfiguration with no vendor to the App Runner Service. - * - * @default - tracing is not enabled for the service */ - readonly vendor?: Vendor; + readonly traceConfigurationVendor: TraceConfigurationVendor; } /** From 8ac81d36d4f8d261fe83e43fd490c97b5a387ecb Mon Sep 17 00:00:00 2001 From: maz Date: Mon, 3 Jun 2024 00:19:26 +0900 Subject: [PATCH 15/18] fix: incorporate review comments --- .../@aws-cdk/aws-apprunner-alpha/README.md | 2 +- .../lib/observability-configuration.ts | 8 ++-- ...teg.service-observability-configuration.ts | 4 +- .../test/obserbability-configuration.test.ts | 44 +++---------------- .../aws-apprunner-alpha/test/service.test.ts | 2 +- 5 files changed, 14 insertions(+), 46 deletions(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/README.md b/packages/@aws-cdk/aws-apprunner-alpha/README.md index 16f5cc196b7a4..170196cc5c8fc 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/README.md +++ b/packages/@aws-cdk/aws-apprunner-alpha/README.md @@ -263,7 +263,7 @@ To associate an App Runner service with a custom observability configuration, us ```ts const observabilityConfiguration = new apprunner.ObservabilityConfiguration(this, 'ObservabilityConfiguration', { observabilityConfigurationName: 'MyObservabilityConfiguration', - vendor: apprunner.Vendor.AWSXRAY, + traceConfigurationVendor: apprunner.TraceConfigurationVendor.AWSXRAY, }); new apprunner.Service(this, 'DemoService', { diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index 27e3400068ea9..09884386c7b73 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -7,7 +7,7 @@ import { CfnObservabilityConfiguration } from 'aws-cdk-lib/aws-apprunner'; * * @see https://docs.aws.amazon.com/apprunner/latest/dg/monitor.html */ -export enum Vendor { +export enum TraceConfigurationVendor { /** * Tracing (X-Ray) */ @@ -138,7 +138,7 @@ export class ObservabilityConfiguration extends cdk.Resource implements IObserva */ readonly observabilityConfigurationName: string; - public constructor(scope: Construct, id: string, props: ObservabilityConfigurationProps = {}) { + public constructor(scope: Construct, id: string, props: ObservabilityConfigurationProps) { super(scope, id, { physicalName: props.observabilityConfigurationName, }); @@ -153,8 +153,8 @@ export class ObservabilityConfiguration extends cdk.Resource implements IObserva const resource = new CfnObservabilityConfiguration(this, 'Resource', { observabilityConfigurationName: props.observabilityConfigurationName, - traceConfiguration: props.vendor ? { - vendor: props.vendor, + traceConfiguration: props.traceConfigurationVendor ? { + vendor: props.traceConfigurationVendor, } : undefined, }); diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.ts index 9b16e2f3d2c37..8d3ec742b04b8 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/integ.service-observability-configuration.ts @@ -1,5 +1,5 @@ import * as cdk from 'aws-cdk-lib'; -import { Service, Source, ObservabilityConfiguration, Vendor } from '../lib'; +import { Service, Source, ObservabilityConfiguration, TraceConfigurationVendor } from '../lib'; import * as integ from '@aws-cdk/integ-tests-alpha'; const app = new cdk.App(); @@ -7,7 +7,7 @@ const app = new cdk.App(); const stack = new cdk.Stack(app, 'integ-apprunner-observability-configuration'); const observabilityConfiguration = new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { - vendor: Vendor.AWSXRAY, + traceConfigurationVendor: TraceConfigurationVendor.AWSXRAY, }); const service = new Service(stack, 'Service', { diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts b/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts index 2dd7604d50a8e..b110f22750f0f 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts @@ -1,6 +1,6 @@ -import { Match, Template } from 'aws-cdk-lib/assertions'; +import { Template } from 'aws-cdk-lib/assertions'; import * as cdk from 'aws-cdk-lib'; -import { ObservabilityConfiguration, Vendor } from '../lib'; +import { ObservabilityConfiguration, TraceConfigurationVendor } from '../lib'; let stack: cdk.Stack; beforeEach(() => { @@ -14,7 +14,7 @@ test.each([ // WHEN new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { observabilityConfigurationName, - vendor: Vendor.AWSXRAY, + traceConfigurationVendor: TraceConfigurationVendor.AWSXRAY, }); // THEN @@ -26,48 +26,16 @@ test.each([ }); }); -test('create a ObservabilityConfiguration without all properties', () => { - // WHEN - new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { - }); - - // THEN - Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::ObservabilityConfiguration', { - ObservabilityConfigurationName: Match.absent(), - TraceConfiguration: Match.absent(), - }); -}); - -test('create a Observability Configuration without all properties', () => { - // WHEN - new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { - }); - - // THEN - Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::ObservabilityConfiguration', { - ObservabilityConfigurationName: Match.absent(), - TraceConfiguration: Match.absent(), - }); -}); - test.each([ ['tes'], ['test-observability-configuration-name-over-limitation'], -])('observabilityConfigurationName over length limitation (name: %s)', (observabilityConfigurationName: string) => { - expect(() => { - new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { - observabilityConfigurationName, - }); - }).toThrow(`observabilityConfigurationName must be between 4 and 32 characters long, but it has ${observabilityConfigurationName.length} characters.`); -}); - -test.each([ ['-test'], ['test-?'], -])('invalid observabilityConfigurationName (name: %s)', (observabilityConfigurationName: string) => { +])('observabilityConfigurationName over length limitation (name: %s)', (observabilityConfigurationName: string) => { expect(() => { new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { observabilityConfigurationName, + traceConfigurationVendor: TraceConfigurationVendor.AWSXRAY, }); - }).toThrow(`observabilityConfigurationName ${observabilityConfigurationName} must start with a letter or number, and can contain only letters, numbers, hyphens, and underscores.`); + }).toThrow(`observabilityConfigurationName must match the \`^[A-Za-z0-9][A-Za-z0-9\-_]{3,31}$\` pattern, got ${observabilityConfigurationName}`); }); diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts b/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts index 993f0481cb559..13809a5f41b46 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts @@ -1612,7 +1612,7 @@ test('create a service with a Observability Configuration', () => { const stack = new cdk.Stack(app, 'demo-stack'); const observabilityConfiguration = new apprunner.ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { observabilityConfigurationName: 'MyObservabilityConfiguration', - vendor: apprunner.Vendor.AWSXRAY, + traceConfigurationVendor: apprunner.TraceConfigurationVendor.AWSXRAY, }); // WHEN From 0594cd00eaa5d9d575915f69d1ecb8f7604edcf0 Mon Sep 17 00:00:00 2001 From: mazyu36 Date: Tue, 4 Jun 2024 08:27:39 +0900 Subject: [PATCH 16/18] Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts Co-authored-by: Luca Pizzini --- .../aws-apprunner-alpha/lib/observability-configuration.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index 09884386c7b73..c653e8f72ec22 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -153,9 +153,9 @@ export class ObservabilityConfiguration extends cdk.Resource implements IObserva const resource = new CfnObservabilityConfiguration(this, 'Resource', { observabilityConfigurationName: props.observabilityConfigurationName, - traceConfiguration: props.traceConfigurationVendor ? { + traceConfiguration: { vendor: props.traceConfigurationVendor, - } : undefined, + }, }); this.observabilityConfigurationArn = resource.attrObservabilityConfigurationArn; From 1e5f12e53d763d430c8e1ec4852ea8477db97f92 Mon Sep 17 00:00:00 2001 From: maz Date: Wed, 19 Jun 2024 11:03:49 +0900 Subject: [PATCH 17/18] fix: update from method --- .../lib/observability-configuration.ts | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts index c653e8f72ec22..56be971ec5500 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/lib/observability-configuration.ts @@ -40,11 +40,6 @@ export interface ObservabilityConfigurationAttributes { */ readonly observabilityConfigurationName: string; - /** - * The ARN of the Observability configuration. - */ - readonly observabilityConfigurationArn: string; - /** * The revision of the Observability configuration. */ @@ -85,14 +80,17 @@ export class ObservabilityConfiguration extends cdk.Resource implements IObserva */ public static fromObservabilityConfigurationAttributes(scope: Construct, id: string, attrs: ObservabilityConfigurationAttributes): IObservabilityConfiguration { - const observabilityConfigurationArn = attrs.observabilityConfigurationArn; const observabilityConfigurationName = attrs.observabilityConfigurationName; const observabilityConfigurationRevision = attrs.observabilityConfigurationRevision; - class Import extends cdk.Resource { - public readonly observabilityConfigurationArn = observabilityConfigurationArn - public readonly observabilityConfigurationName = observabilityConfigurationName - public readonly observabilityConfigurationRevision = observabilityConfigurationRevision + class Import extends cdk.Resource implements IObservabilityConfiguration { + public readonly observabilityConfigurationName = observabilityConfigurationName; + public readonly observabilityConfigurationRevision = observabilityConfigurationRevision; + public readonly observabilityConfigurationArn = cdk.Stack.of(this).formatArn({ + resource: 'observabilityconfiguration', + service: 'apprunner', + resourceName: `${attrs.observabilityConfigurationName}/${attrs.observabilityConfigurationRevision}`, + }); } return new Import(scope, id); @@ -102,22 +100,22 @@ export class ObservabilityConfiguration extends cdk.Resource implements IObserva * Imports an App Runner Observability Configuration from its ARN */ public static fromArn(scope: Construct, id: string, observabilityConfigurationArn: string): IObservabilityConfiguration { - const arn = cdk.Stack.of(scope).splitArn(observabilityConfigurationArn, cdk.ArnFormat.SLASH_RESOURCE_NAME); - - const resourceParts = arn.resourceName?.split('/'); + const resourceParts = cdk.Fn.split('/', observabilityConfigurationArn); if (!resourceParts || resourceParts.length < 3) { throw new Error(`Unexpected ARN format: ${observabilityConfigurationArn}`); } - const observabilityConfigurationName = resourceParts[0]; - const observabilityConfigurationRevision = parseInt(resourceParts[1]); + const observabilityConfigurationName = cdk.Fn.select(0, resourceParts); + const observabilityConfigurationRevision = Number(cdk.Fn.select(1, resourceParts)); - return ObservabilityConfiguration.fromObservabilityConfigurationAttributes(scope, id, { - observabilityConfigurationArn, - observabilityConfigurationName, - observabilityConfigurationRevision, - }); + class Import extends cdk.Resource implements IObservabilityConfiguration { + public readonly observabilityConfigurationName = observabilityConfigurationName; + public readonly observabilityConfigurationRevision = observabilityConfigurationRevision; + public readonly observabilityConfigurationArn = observabilityConfigurationArn; + } + + return new Import(scope, id); } /** From db48ffec9261d076cc84a1b8c565efb9c5651af9 Mon Sep 17 00:00:00 2001 From: maz Date: Fri, 21 Jun 2024 01:05:56 +0900 Subject: [PATCH 18/18] add tag test --- .../test/obserbability-configuration.test.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts b/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts index b110f22750f0f..d450c9a04f976 100644 --- a/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts +++ b/packages/@aws-cdk/aws-apprunner-alpha/test/obserbability-configuration.test.ts @@ -39,3 +39,23 @@ test.each([ }); }).toThrow(`observabilityConfigurationName must match the \`^[A-Za-z0-9][A-Za-z0-9\-_]{3,31}$\` pattern, got ${observabilityConfigurationName}`); }); + +test('create an Auto scaling Configuration with tags', () => { + // WHEN + const observabilityConfiguration = new ObservabilityConfiguration(stack, 'ObservabilityConfiguration', { + observabilityConfigurationName: 'my-autoscaling-config', + traceConfigurationVendor: TraceConfigurationVendor.AWSXRAY, + }); + + cdk.Tags.of(observabilityConfiguration).add('Environment', 'production'); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::AppRunner::ObservabilityConfiguration', { + Tags: [ + { + Key: 'Environment', + Value: 'production', + }, + ], + }); +});