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

feat(apprunner): add ObservabilityConfiguration for AppRunner Service #30359

Merged
merged 25 commits into from
Jun 24, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
a4e11b4
add ObservabilityConfiguration for AppRunner Service
mazyu36 May 28, 2024
e73b10d
feat: add fromArn method
mazyu36 May 28, 2024
0027a86
Merge branch 'main' into apprunner-observability-22985
mazyu36 May 28, 2024
78629f1
Merge branch 'main' into apprunner-observability-22985
mazyu36 May 30, 2024
10277c4
Update packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts
mazyu36 Jun 1, 2024
4af4868
Update packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts
mazyu36 Jun 1, 2024
c532781
Update packages/@aws-cdk/aws-apprunner-alpha/README.md
mazyu36 Jun 1, 2024
8a7f2f7
Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-config…
mazyu36 Jun 1, 2024
b0cc774
Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-config…
mazyu36 Jun 1, 2024
71da222
Update packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts
mazyu36 Jun 1, 2024
b93cd9b
fix: incorporate review comments
mazyu36 Jun 2, 2024
d525912
Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-config…
mazyu36 Jun 2, 2024
4812423
Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-config…
mazyu36 Jun 2, 2024
d667bb4
Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-config…
mazyu36 Jun 2, 2024
f6e9e2c
Update packages/@aws-cdk/aws-apprunner-alpha/test/service.test.ts
mazyu36 Jun 2, 2024
2481648
Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-config…
mazyu36 Jun 2, 2024
8ac81d3
fix: incorporate review comments
mazyu36 Jun 2, 2024
0594cd0
Update packages/@aws-cdk/aws-apprunner-alpha/lib/observability-config…
mazyu36 Jun 3, 2024
6d5a86c
Merge branch 'main' into apprunner-observability-22985
mazyu36 Jun 11, 2024
1e5f12e
fix: update from method
mazyu36 Jun 19, 2024
db48ffe
add tag test
mazyu36 Jun 20, 2024
6eaaee0
Merge branch 'main' into apprunner-observability-22985
mergify[bot] Jun 20, 2024
8459f87
resolve conflict
mazyu36 Jun 21, 2024
4718de2
Merge branch 'main' into apprunner-observability-22985
mazyu36 Jun 21, 2024
c850eb3
Merge branch 'main' into apprunner-observability-22985
mergify[bot] Jun 24, 2024
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
19 changes: 19 additions & 0 deletions packages/@aws-cdk/aws-apprunner-alpha/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,22 @@ new apprunner.Service(this, 'Service', {
}),
});
```

## Observability Configuration

To associate an App Runner service with a custom Observability Configuration, define `observabilityConfiguration` for the service.
mazyu36 marked this conversation as resolved.
Show resolved Hide resolved

```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,
});
```
1 change: 1 addition & 0 deletions packages/@aws-cdk/aws-apprunner-alpha/lib/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// AWS::AppRunner CloudFormation Resources:
export * from './service';
export * from './vpc-connector';
export * from './observability-configuration';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please order this alphabetically?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. I fixed it.

Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
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
mazyu36 marked this conversation as resolved.
Show resolved Hide resolved
*/
export enum Vendor {
/**
* AWS X-RAY
mazyu36 marked this conversation as resolved.
Show resolved Hide resolved
*/
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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* @default Vendor.AWSXRAY
* @default - tracing is not enabled for the service

From the CloudFormation documentation, it seems we're allowed to omit this value.
Can you please verify if the construct deploys when that is the case?
Ie, changing the implementation to:

    const resource = new CfnObservabilityConfiguration(this, 'Resource', {
      observabilityConfigurationName: props.observabilityConfigurationName,
      traceConfiguration: props.vendor ? {
        vendor: props.vendor,
      } : undefined,
    });

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks.
I fixed it, and I tried to deploy it.
An Observability Configuration without TraceConfiguration could be deployed.

% aws apprunner describe-observability-configuration --observability-configuration-arn arn:aws:apprunner:us-east-1: 01234567890:observabilityconfiguration/my-observability-no-vendor/1/2bc8fefaddcc4b878c0dfe2598412555 --region us-east-1
{
    "ObservabilityConfiguration": {
        "ObservabilityConfigurationArn": "arn:aws:apprunner:us-east-1:01234567890:observabilityconfiguration/my-observability-no-vendor/1/2bc8fefaddcc4b878c0dfe2598412555",
        "ObservabilityConfigurationName": "my-observability-no-vendor",
        "ObservabilityConfigurationRevision": 1,
        "Latest": false,
        "Status": "ACTIVE",
        "CreatedAt": "2024-06-02T09:46:36.997000+09:00"
    }
}

But the App Runner Service with it could not be deployed. It threw an error.
スクリーンショット 2024-06-02 10 11 59

So, I added the above information to the documentation for the vendor property.

*/
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 {
/**
* Imports an App Runner Observability Configuration from 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);
}

/**
* 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
*/
readonly observabilityConfigurationArn: string;
mazyu36 marked this conversation as resolved.
Show resolved Hide resolved

/**
* The revision of the Observability configuration.
* @attribute
*/
readonly observabilityConfigurationRevision: number;

/**
* The name of the Observability configuration.
* @attribute
*/
mazyu36 marked this conversation as resolved.
Show resolved Hide resolved
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;
}
}
12 changes: 12 additions & 0 deletions packages/@aws-cdk/aws-apprunner-alpha/lib/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,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
Expand Down Expand Up @@ -723,6 +724,13 @@ export interface ServiceProps {
* @default - Use an AWS managed key
*/
readonly kmsKey?: kms.IKey;

/**
* Settings for an App Runner tracing feature.
*
* @default - Not enable tracing
mazyu36 marked this conversation as resolved.
Show resolved Hide resolved
*/
readonly observabilityConfiguration?: IObservabilityConfiguration;
}

/**
Expand Down Expand Up @@ -1259,6 +1267,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,
mazyu36 marked this conversation as resolved.
Show resolved Hide resolved
} : undefined,
});

// grant required privileges for the role
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading