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(sns): add delivery policy to sns subscriptions #30830

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

LaurenceWarne
Copy link
Contributor

@LaurenceWarne LaurenceWarne commented Jul 11, 2024

Issue # (if applicable)

Closes #17576.

Reason for this change

To allow setting of delivery policy for appropriate sns subscriptions.

Description of changes

Subscriptions can now take a new parameter deliveryPolicy which consists of a healthyRetryPolicy, a throttlePolicy, and a requestPolicy (each having the same parameters described here: https://docs.aws.amazon.com/sns/latest/dg/sns-message-delivery-retries.html#creating-delivery-policy).

Description of how you validated changes

New integration test along with unit tests.

Checklist


By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license

@github-actions github-actions bot added the beginning-contributor [Pilot] contributed between 0-2 PRs to the CDK label Jul 11, 2024
@aws-cdk-automation aws-cdk-automation requested a review from a team July 11, 2024 19:36
@github-actions github-actions bot added effort/small Small work item – less than a day of effort feature-request A feature should be added or improved. p2 labels Jul 11, 2024
* Algorithms which can be used by SNS to calculate the delays associated with all of the retry attempts between the first and last retries in the backoff phase.
*/
export enum BackoffFunction {
/** Arithmetic.
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not the best doc I've ever written 😅 , the best indicator of to what these each of these do that I found was an image at the very bottom of the doc page here: https://docs.aws.amazon.com/sns/latest/dg/sns-message-delivery-retries.html - suggestions welcome.

Copy link
Contributor

Choose a reason for hiding this comment

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

I couldn't come up with a good description either, but I thought it would be good to at least add a link to this diagram, which shows the differences in the behavior of each backoff function.

スクリーンショット 2024-09-21 9 28 24

However, it seems that this diagram doesn't exist in English😓

In Japanese: https://docs.aws.amazon.com/de_de/sns/latest/dg/sns-message-delivery-retries.html#creating-delivery-policy
In English: https://docs.aws.amazon.com/sns/latest/dg/sns-message-delivery-retries.html

I would appreciate it if you could consult with the maintainer again.

/** The minimum delay for a retry (in seconds). Must be at least 1 and not exceed `maxDelayTarget`.
* @default 20
*/
readonly minDelayTarget: number;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Only, this and the next two appear to be mandatory if healthyRetryPolicy is specified, thought I can't find any specific doc for this.

Copy link
Contributor

Choose a reason for hiding this comment

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

Would it be correct to assume that if these are not set, it will result in an error during deployment? If so, I am curious when the default values would be set.

@aws-cdk-automation
Copy link
Collaborator

AWS CodeBuild CI Report

  • CodeBuild project: AutoBuildv2Project1C6BFA3F-wQm2hXv2jqQv
  • Commit ID: e801ab3
  • Result: SUCCEEDED
  • Build Logs (available for 30 days)

Powered by github-codebuild-logs, available on the AWS Serverless Application Repository

@aws-cdk-automation aws-cdk-automation added the pr/needs-community-review This PR needs a review from a Trusted Community Member or Core Team Member. label Jul 11, 2024
@pahud
Copy link
Contributor

pahud commented Jul 30, 2024

Hi

This PR has been pending for community review for a while. Please consider posting it on the #contributing channel in cdk.dev. Community members will be on the lookout there as well for possible reviews.

Check How to get your P2 PR community reviewed for more details.

@LaurenceWarne
Copy link
Contributor Author

Thanks, I've posted on the channel.

Copy link
Contributor

@badmintoncryer badmintoncryer left a comment

Choose a reason for hiding this comment

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

Thank you for creating such a wonderful PR! I’ve quickly reviewed it!

Comment on lines +14 to +15
/** Linear.
*/
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
/** Linear.
*/
/**
* Linear
*/

Comment on lines +11 to +12
/** Linear.
*/
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
/** Linear.
*/
/**
* Geometric
*/

Comment on lines +8 to +9
/** Geometric.
*/
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
/** Geometric.
*/
/**
* Exponential
*/

* Algorithms which can be used by SNS to calculate the delays associated with all of the retry attempts between the first and last retries in the backoff phase.
*/
export enum BackoffFunction {
/** Arithmetic.
Copy link
Contributor

Choose a reason for hiding this comment

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

I couldn't come up with a good description either, but I thought it would be good to at least add a link to this diagram, which shows the differences in the behavior of each backoff function.

スクリーンショット 2024-09-21 9 28 24

However, it seems that this diagram doesn't exist in English😓

In Japanese: https://docs.aws.amazon.com/de_de/sns/latest/dg/sns-message-delivery-retries.html#creating-delivery-policy
In English: https://docs.aws.amazon.com/sns/latest/dg/sns-message-delivery-retries.html

I would appreciate it if you could consult with the maintainer again.

Comment on lines +23 to +25
/** The maximum number of deliveries per second, per subscription.
* @default - no throttling
*/
Copy link
Contributor

Choose a reason for hiding this comment

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

Could you also insert line breaks in the same way for the other JSDOC comments?

Suggested change
/** The maximum number of deliveries per second, per subscription.
* @default - no throttling
*/
/**
* The maximum number of deliveries per second, per subscription.
*
* @default - no throttling
*/

/** The minimum delay for a retry (in seconds). Must be at least 1 and not exceed `maxDelayTarget`.
* @default 20
*/
readonly minDelayTarget: number;
Copy link
Contributor

Choose a reason for hiding this comment

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

Would it be correct to assume that if these are not set, it will result in an error during deployment? If so, I am curious when the default values would be set.

Comment on lines +154 to +156
if (healthyRetryPolicy.minDelayTarget < 1 || healthyRetryPolicy.minDelayTarget > delayTargetLimit) {
throw new Error(`minDelayTarget must be between 1 and ${delayTargetLimit} inclusive`);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

In order to support Duration, please make the following modifications.

Suggested change
if (healthyRetryPolicy.minDelayTarget < 1 || healthyRetryPolicy.minDelayTarget > delayTargetLimit) {
throw new Error(`minDelayTarget must be between 1 and ${delayTargetLimit} inclusive`);
}
const minDelayTarget = healthyRetryPolicy.minDelayTarget
const maxDelayTarget = healthyRetryPolicy.maxDelayTarget
if (minDelayTarget.toMilliseconds() < Duration.seconds(1).toMilliseconds()) {
throw new Error(`minDelayTarget must be at least 1 second, got ${minDelayTarget.toMilliseconds()}ms.`);
}
if (maxDelayTarget.toMilliseconds() < Duration.seconds(1).toMilliseconds()) {
throw new Error(`maxDelayTarget must be at least 1 second, got ${maxDelayTarget.toMilliseconds()}ms.`);
}
if (minDelayTarget.toSeconds() < 1 || minDelayTarget.toSeconds() > delayTargetLimit) {
throw new Error(`minDelayTarget must be between 1 and ${delayTargetLimit} seconds inclusive`);
}

Comment on lines +157 to +162
if (healthyRetryPolicy.maxDelayTarget < 1 || healthyRetryPolicy.maxDelayTarget > delayTargetLimit) {
throw new Error(`maxDelayTarget must be between 1 and ${delayTargetLimit} inclusive`);
}
if (healthyRetryPolicy.minDelayTarget > healthyRetryPolicy.maxDelayTarget) {
throw new Error('minDelayTarget must not exceed maxDelayTarget');
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Could you also adjust these if statements to support Duration?

throw new Error('minDelayTarget must not exceed maxDelayTarget');
}
const numRetriesLimit = 100;
if (healthyRetryPolicy.numRetries < 0 || healthyRetryPolicy.numRetries > numRetriesLimit) {
Copy link
Contributor

@badmintoncryer badmintoncryer Sep 21, 2024

Choose a reason for hiding this comment

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

Is it necessary to validate that numRetries is an Integer?

@@ -136,6 +144,43 @@ export class Subscription extends Resource {
throw new Error('Subscription role arn is required field for subscriptions with a firehose protocol.');
}

if (props.deliveryPolicy) {
Copy link
Contributor

Choose a reason for hiding this comment

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

How about performing these validations inside the renderDeliveryPolicy()?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
beginning-contributor [Pilot] contributed between 0-2 PRs to the CDK effort/small Small work item – less than a day of effort feature-request A feature should be added or improved. p2 pr/needs-community-review This PR needs a review from a Trusted Community Member or Core Team Member.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

(sns): Allow delivery retry policy configuration of HTTPS subscription on SNS topic
4 participants