The transport does not support transport.
to specify the connection string via code.
CredentialSource
Mandatory
Default: AWS SDK credentials
By default the endpoint uses the SDK to retrieve AWS credentials. The AWS SDK permits a large number of transparent methods for configuring the credentials as outlined in the .NET SDK guidelines.
Example: To manually control the credentials retrieval, specify:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.ClientFactory(() => new AmazonSQSClient(new InstanceProfileAWSCredentials()));
for S3 specify
var transport = endpointConfiguration.UseTransport<SqsTransport>();
var s3Configuration = transport.S3(bucketName, keyPrefix);
s3Configuration.ClientFactory(() => new AmazonS3Client(new InstanceProfileAWSCredentials()));
Region
Mandatory
Default: AWS SDK region
By default the endpoint uses the SDK to retrieve the default AWS region from the AWS_REGION
environment variable.
This is the Amazon Web Services Region in which to access the SQS service. The value must be a valid AWS region code.
Example: To manually control the region, specify
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.ClientFactory(() => new AmazonSQSClient(
new AmazonSQSConfig {
RegionEndpoint = RegionEndpoint.APSoutheast2
}));
for S3 specify
var transport = endpointConfiguration.UseTransport<SqsTransport>();
var s3Configuration = transport.S3(bucketName, keyPrefix);
s3Configuration.ClientFactory(() => new AmazonS3Client(
new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.APSoutheast2
}));
ProxyHost and ProxyPort
Optional
Default: Empty
This is the name of the host of the proxy server that the client must authenticate to.
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.ClientFactory(() => new AmazonSQSClient(
new AmazonSQSConfig {
ProxyCredentials = new NetworkCredential(userName, password),
ProxyHost = "127.0.0.1",
ProxyPort = 8888
}));
for S3 specify
var transport = endpointConfiguration.UseTransport<SqsTransport>();
var s3Configuration = transport.S3(bucketName, keyPrefix);
s3Configuration.ClientFactory(() => new AmazonS3Client(
new AmazonS3Config
{
ProxyCredentials = new NetworkCredential(userName, password),
ProxyHost = "127.0.0.1",
ProxyPort = 8888
}));
It is discouraged to specify username and password in code.
SQS Client
Optional
Default: new AmazonSQSClient()
By default the transport uses a parameterless constructor to build the SQS client. This overrides the default SQS client with a custom one.
Example: To use a custom client, specify:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.ClientFactory(() => new AmazonSQSClient(new AmazonSQSConfig()));
SNS Client
Optional
Default: new AmazonSimpleNotificationServiceClient()
By default the transport uses a parameterless constructor to build the SNS client. This overrides the default SNS client with a custom one.
Example: To use a custom client, specify:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.ClientFactory(() => new AmazonSimpleNotificationServiceClient(new AmazonSimpleNotificationServiceConfig()));
Retention period
Optional
Default: 4 days
This is the maximum time that a message will be retained within SQS and S3. When a sent message is not received and successfully processed within the specified time, the message will be lost. This value applies to both SQS and S3 - messages in SQS will be deleted after this amount of time, and large message bodies stored in S3 will automatically be deleted after this amount of time.
The maximum value is 14 days.
Example: To set this to the maximum value, specify:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.MaxTimeToLive(TimeSpan.FromDays(10));
Large message payloads stored in S3 are never deleted by the receiving endpoint, regardless of whether they were successfully handled. The S3 ageing policy controls the deletion of the payload and will respect the configured TTL. Since message payloads stored in S3 are important for audited and failed messages stored in ServiceControl, it is crucial that the ServiceControl message retention period is aligned with the configured SQS and S3 TTL.
Queue name prefix
Optional
Default: None
This string value is prepended to the name of every SQS queue referenced by the endpoint. This is useful when deploying many instances of the same application in the same AWS region (e.g. a development instance, a QA instance, and a production instance), and the queue names must be distinguished from each other.
Example: For a development instance, specify:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.QueueNamePrefix("DEV-");
For example, queue names for the endpoint called "SampleEndpoint" might be:
DEV-SampleEndpoint
DEV-SampleEndpoint-Retries
DEV-SampleEndpoint-Timeouts
DEV-SampleEndpoint-TimeoutsDispatcher
Offload large messages to S3
Optional
Default: Disabled. Any attempt to send a message larger than the SQS limit will fail.
This option configures the S3 bucket to be used to store messages larger than 256 kB. If this option is not specified, S3 will not be used at all and any attempt to send a message larger than 256 kB will fail.
If the specified bucket doesn't exist, it will be created when the endpoint starts.
Example: To use a bucket named nsb-sqs-messages
, specify:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
var s3Configuration = transport.S3(
bucketForLargeMessages: "nsb-sqs-messages",
keyPrefix: "my/sample/path");
Key prefix
Mandatory
This is the path within the specified S3 bucket to store large messages.
S3 Client
Optional
Default: new AmazonS3Client()
By default, the transport uses a parameterless constructor to build the S3 client. This overrides the default S3 client with a custom one.
Example: To use a custom client, specify:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
var s3Configuration = transport.S3(bucketName, keyPrefix);
s3Configuration.ClientFactory(() => new AmazonS3Client(new AmazonS3Config()));
Encryption
Optional
Default: Disabled
Specifies how the large messages stored in S3 are to be encrypted. The default option is no encryption. The alternative is to use a managed encryption key:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
var s3Configuration = transport.S3(bucketName, keyPrefix);
s3Configuration.ServerSideEncryption(ServerSideEncryptionMethod.AES256, keyManagementServiceKeyId: "keyId");
or to provide a custom key:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
var s3Configuration = transport.S3(bucketName, keyPrefix);
s3Configuration.ServerSideCustomerEncryption(ServerSideEncryptionCustomerMethod.AES256, "key", providedKeyMD5: "keyMD5");
V1 Compatibility Mode
Optional
Default: Disabled
This option enables serialization of the TimeToBeReceived
and ReplyToAddress
message headers in the message envelope for compatibility with endpoints using version 1 of the transport.
This feature is available in version 3.3.0 to 6.0.*, however it has been marked as obsolete in version 6.1.0 with a warning, and will be treated as an error from version 7.0.0.
Example: To enable version 1 compatibility, specify:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.EnableV1CompatibilityMode();
Unrestricted Delayed Delivery
Optional
Default: disabled
SQS supports delaying message delivery by up to 15 minutes natively. To delay messages longer than 15 minutes, the unrestricted delayed delivery mode has to be enabled.
Example
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.UnrestrictedDurationDelayedDelivery();
For a detailed overview about the unrestricted delayed delivery feature, refer to the delayed delivery documentation.
Topic name prefix
Optional
Default: None
This string value is prepended to the name of every SNS topic subscribed by the endpoint. This is useful when deploying many instances of the same application in the same AWS region (e.g. a development instance, a QA instance, and a production instance), and the topic names must be distinguished from each other.
Example: For a development instance, specify:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.TopicNamePrefix("DEV-");
For example, topic names for the topic called "MyNameSpace.MyEvent" might be:
DEV-MyNameSpace-MyEvent
Topic name generator
Optional
Default: $"{topicNamePrefix}{eventType.
with unsupported characters like .
being replaced with a hyphen -
Provides the ability to override the topic name generation with a custom function that allows creating topics in alignment with custom conventions.
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.TopicNameGenerator((eventType, topicNamePrefix) => $"{topicNamePrefix}{eventType.Name}");
Be aware that ServiceControl doesn't allow customization of this convention when publishing ServiceControl events. ServiceControl events will be published using the default naming convention.
Custom topics mappings
The transport topology describes in depth how the topology is determined by subscribers. There are scenarios in which a custom mapping is needed.
The MapEvent
transport configuration API can be used to customize the way subscribers determine the topic to subscribe to. If the subscribers have knowledge of both the published event type and the subscribed one, the following API can be used:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.MapEvent<SubscribedEvent, PublishedEvent>();
The types are only used to determine the topic name; subscribers can define dummy empty types to use the strongly typed API shown above.
If the published type is not known at compilation time, the following API can be used:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.MapEvent<SubscribedEvent>("topic-used-by-the-publisher");
Policy
When an endpoint is starting the auto-subscribe mechanism ensures the necessary SNS topics for the events are created and all subscriptions are set up to receive the events published to the topics. AWS IAM policies offer very fine-grained control of access to services and resources.
NServiceBus automatically subscribes to all event types an endpoint has handlers for. For example, an endpoint may have two handlers:
public class OrderAcceptedHandler : IHandleMessages<OrderAccepted> { ... }
public class OrderPaidHandler : IHandleMessages<OrderPaid> { ... }
The transport creates a policy statement for each event type it subscribes to:
{
...
"Statement": [
{
...
"Action": "sqs:SendMessage",
"Resource": "arn:aws:sqs:some-region:some-account:endpoint",
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:sns:some-region:some-account:Sales-OrderAccepted"
}
}
},
{
...
"Action": "sqs:SendMessage",
"Resource": "arn:aws:sqs:some-region:some-account:endpoint",
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:sns:some-region:some-account:Sales-OrderPaid"
}
}
}
]
}
A policy statement is also created when an endpoint explicitly subscribes to an event type using session.
. Unsubscribing does not modify the policy.
Message driven pub/sub compatibility mode
To gradually move an existing system from message driven pub/sub to native pub/sub using SNS, it's possible to enable message-driven pub/sub compatibility mode.
Message-driven pub/sub compatibility mode must be enabled on publisher endpoints. When enabled, publishers will still consume subscription messages sent by endpoints using message-driven pub/sub, and when publishing an event, it will be published both to legacy subscribers and to SNS. Publishers deduplicate published events.
To enable message-driven Pub/Sub compatibility mode, configure the endpoint as follows:
var transport = endpointConfiguration.UseTransport<SqsTransport>();
transport.EnableMessageDrivenPubSubCompatibilityMode();
Subscription cache configuration
The default value for SNS topic subscription cache invalidation (5 seconds) can be changed using:
var migrationSettings = transport.EnableMessageDrivenPubSubCompatibilityMode();
migrationSettings.SubscriptionsCacheTTL(TimeSpan.FromSeconds(30));
Topic cache configuration
The default value for SNS topic cache invalidation (5 seconds) can be changed using:
var migrationSettings = transport.EnableMessageDrivenPubSubCompatibilityMode();
migrationSettings.TopicCacheTTL(TimeSpan.FromSeconds(30));
Message visibility timeout
The default value for the message visibility timeout setting (30 seconds) can be changed using:
var migrationSettings = transport.EnableMessageDrivenPubSubCompatibilityMode();
migrationSettings.MessageVisibilityTimeout(timeoutInSeconds: 10);