Package software.amazon.awscdk.services.sqs
Amazon Simple Queue Service Construct Library
Amazon Simple Queue Service (SQS) is a fully managed message queuing service that enables you to decouple and scale microservices, distributed systems, and serverless applications. SQS eliminates the complexity and overhead associated with managing and operating message oriented middleware, and empowers developers to focus on differentiating work. Using SQS, you can send, store, and receive messages between software components at any volume, without losing messages or requiring other services to be available.
Installation
Import to your project:
import software.amazon.awscdk.services.sqs.*;
Basic usage
Here's how to add a basic queue to your application:
new Queue(this, "Queue");
Encryption
By default queues are encrypted using SSE-SQS. If you want to change the encryption mode, set the encryption property.
The following encryption modes are supported:
- KMS key that SQS manages for you
- KMS key that you can managed yourself
- Server-side encryption managed by SQS (SSE-SQS)
- Unencrypted
To learn more about SSE-SQS on Amazon SQS, please visit the Amazon SQS documentation.
// Use managed key
// Use managed key
Queue.Builder.create(this, "Queue")
.encryption(QueueEncryption.KMS_MANAGED)
.build();
// Use custom key
Key myKey = new Key(this, "Key");
Queue.Builder.create(this, "Queue")
.encryption(QueueEncryption.KMS)
.encryptionMasterKey(myKey)
.build();
// Use SQS managed server side encryption (SSE-SQS)
// Use SQS managed server side encryption (SSE-SQS)
Queue.Builder.create(this, "Queue")
.encryption(QueueEncryption.SQS_MANAGED)
.build();
// Unencrypted queue
// Unencrypted queue
Queue.Builder.create(this, "Queue")
.encryption(QueueEncryption.UNENCRYPTED)
.build();
Encryption in transit
If you want to enforce encryption of data in transit, set the enforceSSL property to true.
A resource policy statement that allows only encrypted connections over HTTPS (TLS)
will be added to the queue.
Queue.Builder.create(this, "Queue")
.enforceSSL(true)
.build();
First-In-First-Out (FIFO) queues
FIFO queues give guarantees on the order in which messages are dequeued, and have additional features in order to help guarantee exactly-once processing. For more information, see the SQS manual. Note that FIFO queues are not available in all AWS regions.
A queue can be made a FIFO queue by either setting fifo: true, giving it a name which ends
in ".fifo", or by enabling a FIFO specific feature such as: content-based deduplication,
deduplication scope or fifo throughput limit.
Dead letter source queues permission
You can configure the permission settings for queues that can designate the created queue as their dead-letter queue using the redriveAllowPolicy attribute.
By default, all queues within the same account and region are permitted as source queues.
IQueue sourceQueue;
// Only the sourceQueue can specify this queue as the dead-letter queue.
Queue queue1 = Queue.Builder.create(this, "Queue2")
.redriveAllowPolicy(RedriveAllowPolicy.builder()
.sourceQueues(List.of(sourceQueue))
.build())
.build();
// No source queues can specify this queue as the dead-letter queue.
Queue queue2 = Queue.Builder.create(this, "Queue")
.redriveAllowPolicy(RedriveAllowPolicy.builder()
.redrivePermission(RedrivePermission.DENY_ALL)
.build())
.build();
Monitoring
SQS metrics are available as metric* methods on a queue; metric() returns any metric by name:
Queue queue = new Queue(this, "Queue");
queue.metricApproximateAgeOfOldestMessage().createAlarm(this, "MessagesTooOld", CreateAlarmOptions.builder()
.threshold(Duration.minutes(15).toSeconds())
.evaluationPeriods(3)
.build());
metricApproximateNumberOfMessagesOutstanding() returns
ApproximateNumberOfMessagesVisible + ApproximateNumberOfMessagesNotVisible as a metric math
expression: messages waiting to be picked up, plus messages received but not yet deleted.
Autoscaling consumers on queue depth
Scaling a worker fleet on queue depth needs a different metric in each direction:
- Scale out on
ApproximateNumberOfMessagesVisible— work nobody has started yet. An in-flight message is already owned by a consumer, so adding capacity for it produces an idle consumer. - Scale in on
metricApproximateNumberOfMessagesOutstanding()— everything still owed. Receiving a message moves it fromVisibletoNotVisible, so a policy watchingVisiblealone cannot tell a consumer that just picked up work from one that finished it, and can terminate a consumer mid-message. The message reappears only after its visibility timeout, so the longer consumers hold messages, the longer that work stalls.
That means two one-sided policies; the change: 0 step keeps each from acting in the other
direction:
FargateService service;
Queue queue = new Queue(this, "Queue");
ScalableTaskCount taskCount = service.autoScaleTaskCount(EnableScalingProps.builder().minCapacity(1).maxCapacity(10).build());
taskCount.scaleOnMetric("ScaleOutOnWaitingWork", BasicStepScalingPolicyProps.builder()
.metric(queue.metricApproximateNumberOfMessagesVisible(MetricOptions.builder().period(Duration.minutes(1)).build()))
.scalingSteps(List.of(ScalingInterval.builder().upper(30).change(0).build(), ScalingInterval.builder().lower(30).change(+1).build()))
.adjustmentType(AdjustmentType.CHANGE_IN_CAPACITY)
.build());
// Remove a task only when nothing is outstanding, so it cannot be holding a message.
taskCount.scaleOnMetric("ScaleInOnOutstandingWork", BasicStepScalingPolicyProps.builder()
.metric(queue.metricApproximateNumberOfMessagesOutstanding(MetricOptions.builder().period(Duration.minutes(1)).build()))
.scalingSteps(List.of(ScalingInterval.builder().upper(0).change(-1).build(), ScalingInterval.builder().lower(0).change(0).build()))
.adjustmentType(AdjustmentType.CHANGE_IN_CAPACITY)
.build());
Caveats:
- Target tracking rejects this metric. It accepts only direct metrics, so
scaleToTrackCustomMetric()throwsOnly direct metrics are supported for Target Tracking(aws-cdk#20659). ApproximateNumberOfMessagesNotVisiblecan briefly report non-zero on an empty queue if an SQS storage server is unavailable. Evaluate several consecutive datapoints, especially when scaling in to zero.- Neither term counts delayed messages. Add
metricApproximateNumberOfMessagesDelayed()if you use delay queues orDelaySeconds.
-
ClassDescriptionThe
AWS::SQS::Queueresource creates an Amazon SQS standard or FIFO queue.A fluent builder forCfnQueue.TheAWS::SQS::QueueInlinePolicyresource associates one Amazon SQS queue with one policy.A fluent builder forCfnQueueInlinePolicy.Properties for defining aCfnQueueInlinePolicy.A builder forCfnQueueInlinePolicyPropsAn implementation forCfnQueueInlinePolicyPropsTheAWS::SQS::QueuePolicytype applies a policy to Amazon SQS queues.A fluent builder forCfnQueuePolicy.Properties for defining aCfnQueuePolicy.A builder forCfnQueuePolicyPropsAn implementation forCfnQueuePolicyPropsProperties for defining aCfnQueue.A builder forCfnQueuePropsAn implementation forCfnQueuePropsDead letter queue settings.A builder forDeadLetterQueueAn implementation forDeadLetterQueueWhat kind of deduplication scope to apply.Whether the FIFO queue throughput quota applies to the entire queue or per message group.Represents an SQS queue.Internal default implementation forIQueue.A proxy class which represents a concrete javascript instance of this type.A new Amazon SQS queue.A fluent builder forQueue.Reference to a queue.A builder forQueueAttributesAn implementation forQueueAttributesReference to a new or existing Amazon SQS queue.What kind of encryption to apply to this queue.Collection of grant methods for a IQueueRef.The policy for an SQS Queue.A fluent builder forQueuePolicy.Properties to associate SQS queues with a policy.A builder forQueuePolicyPropsAn implementation forQueuePolicyPropsProperties for creating a new Queue.A builder forQueuePropsAn implementation forQueuePropsPermission settings for the dead letter source queue.A builder forRedriveAllowPolicyAn implementation forRedriveAllowPolicyThe permission type that defines which source queues can specify the current queue as the dead-letter queue.