aws_s3 input
Downloads objects within an Amazon S3 bucket, optionally filtered by a prefix, either by walking the items in the bucket or by streaming upload notifications in realtime.
- Common
- Advanced
# Common config fields, showing default values
input:
label: ""
aws_s3:
bucket: ""
prefix: ""
scanner: {"to_the_end":{}}
sqs:
url: ""
key_path: "Records.*.s3.object.key"
bucket_path: "Records.*.s3.bucket.name"
envelope_path: ""
nack_visibility_timeout: 0
# All config fields, showing default values
input:
label: ""
aws_s3:
bucket: ""
prefix: ""
region: "" # No default (optional)
endpoint: "" # No default (optional)
tcp:
connect_timeout: "0s"
keep_alive:
idle: "15s"
interval: "15s"
count: 9
tcp_user_timeout: "0s"
credentials:
profile: "" # No default (optional)
id: "" # No default (optional)
secret: "" # No default (optional)
token: "" # No default (optional)
from_ec2_role: false # No default (optional)
role: "" # No default (optional)
role_external_id: "" # No default (optional)
force_path_style_urls: false
delete_objects: false
scanner: {"to_the_end":{}}
sqs:
url: ""
endpoint: ""
key_path: "Records.*.s3.object.key"
bucket_path: "Records.*.s3.bucket.name"
envelope_path: ""
delay_period: ""
max_messages: 10
wait_time_seconds: 0
nack_visibility_timeout: 0
zero_key_warn_interval: "30s"
Stream objects on upload with SQS
A common pattern for consuming S3 objects is to emit upload notification events from the bucket either directly to an SQS queue, or to an SNS topic that is consumed by an SQS queue, and then have your consumer listen for events which prompt it to download the newly uploaded objects. More information about this pattern and how to set it up can be found at in the Amazon S3 docs.
Expanso Edge is able to follow this pattern when you configure an sqs.url, where it consumes events from SQS and only downloads object keys received within those events. In order for this to work Expanso Edge needs to know where within the event the key and bucket names can be found, specified as dot paths with the fields sqs.key_path and sqs.bucket_path. The default values for these fields should already be correct when following the guide above.
If your notification events are being routed to SQS via an SNS topic then the events will be enveloped by SNS, in which case you also need to specify the field sqs.envelope_path, which in the case of SNS to SQS will usually be Message.
When using SQS please make sure you have sensible values for sqs.max_messages and also the visibility timeout of the queue itself. When Expanso Edge consumes an S3 object the SQS message that triggered it is not deleted until the S3 object has been sent onwards. This ensures at-least-once crash resiliency, but also means that if the S3 object takes longer to process than the visibility timeout of your queue then the same objects might be processed multiple times.
Amazon S3 sends an s3:TestEvent notification whenever a bucket's event configuration is saved, to verify the queue is reachable. Expanso Edge detects these (including via an SNS envelope) and deletes them automatically. Any other message with no extractable target key, for example due to a misconfigured sqs.key_path/sqs.bucket_path, is logged as a warning and left on the queue instead.
Download large files
When downloading large files it's often necessary to process it in streamed parts in order to avoid loading the entire file in memory at a given time. In order to do this a scanner can be specified that determines how to break the input into smaller individual messages.
Credentials
By default Expanso Edge will use a shared credentials file when connecting to AWS services. It's also possible to set them explicitly at the component level, allowing you to transfer data across accounts. You can find out more in this document.
Metadata
This input adds the following metadata fields to each message:
- s3_key
- s3_bucket
- s3_last_modified_unix
- s3_last_modified (RFC3339)
- s3_content_type
- s3_content_encoding
- s3_version_id
- All user defined metadata
You can access these metadata fields using function interpolation. Note that user defined metadata is case insensitive within AWS, and it is likely that the keys will be received in a capitalized form, if you wish to make them consistent you can map all metadata keys to lower or uppercase using a Bloblang mapping such as meta = meta().map_each_key(key -> key.lowercase()).
Fields
bucket
The bucket to consume from. If the field sqs.url is specified this field is optional.
Type: string
Default: ""
prefix
An optional path prefix, if set only objects with the prefix are consumed when walking a bucket.
Type: string
Default: ""
region
The AWS region to target.
Type: string
endpoint
Allows you to specify a custom endpoint for the AWS API.
Type: string
tcp
TCP socket configuration.
Type: object
tcp.connect_timeout
Maximum amount of time a dial will wait for a connect to complete. Zero disables.
Type: string
Default: "0s"
tcp.keep_alive
TCP keep-alive probe configuration.
Type: object
tcp.keep_alive.idle
Duration the connection must be idle before sending the first keep-alive probe. Zero defaults to 15s. Negative values disable keep-alive probes.
Type: string
Default: "15s"
tcp.keep_alive.interval
Duration between keep-alive probes. Zero defaults to 15s.
Type: string
Default: "15s"
tcp.keep_alive.count
Maximum unanswered keep-alive probes before dropping the connection. Zero defaults to 9.
Type: int
Default: 9
tcp.tcp_user_timeout
Maximum time to wait for acknowledgment of transmitted data before killing the connection. Linux-only (kernel 2.6.37+), ignored on other platforms. When enabled, keep_alive.idle must be greater than this value per RFC 5482. Zero disables.
Type: string
Default: "0s"
credentials
Optional manual configuration of AWS credentials to use. More information can be found in this document.
Type: object
credentials.profile
A profile from ~/.aws/credentials to use.
Type: string
credentials.id
The ID of credentials to use.
Type: string
credentials.secret
The secret for the credentials being used.
This field contains sensitive information. Use a secret reference rather than a literal value.
Type: string
credentials.token
The token for the credentials being used, required when using short term credentials.
This field contains sensitive information. Use a secret reference rather than a literal value.
Type: string
credentials.from_ec2_role
Use the credentials of a host EC2 machine configured to assume an IAM role associated with the instance.
Type: bool
credentials.role
A role ARN to assume.
Type: string
credentials.role_external_id
An external ID to provide when assuming a role.
Type: string
force_path_style_urls
Forces the client API to use path style URLs for downloading keys, which is often required when connecting to custom endpoints.
Type: bool
Default: false
delete_objects
Whether to delete downloaded objects from the bucket once they are processed.
Type: bool
Default: false
scanner
The scanner by which the stream of bytes consumed will be broken out into individual messages. Scanners are useful for processing large sources of data without holding the entirety of it within memory. For example, the csv scanner allows you to process individual CSV rows without loading the entire CSV file in memory at once.
Type: scanner
Default: {"to_the_end":{}}
sqs
Consume SQS messages in order to trigger key downloads.
Type: object
sqs.url
An optional SQS URL to connect to. When specified this queue will control which objects are downloaded.
Type: string
Default: ""
sqs.endpoint
A custom endpoint to use when connecting to SQS.
Type: string
Default: ""
sqs.key_path
A dot path whereby object keys are found in SQS messages.
Type: string
Default: "Records.*.s3.object.key"
sqs.bucket_path
A dot path whereby the bucket name can be found in SQS messages.
Type: string
Default: "Records.*.s3.bucket.name"
sqs.envelope_path
A dot path of a field to extract an enveloped JSON payload for further extracting the key and bucket from SQS messages. This is specifically useful when subscribing an SQS queue to an SNS topic that receives bucket events.
Type: string
Default: ""
sqs.delay_period
An optional period of time to wait from when a notification was originally sent to when the target key download is attempted.
Type: string
Default: ""
sqs.max_messages
The maximum number of SQS messages to consume from each request.
Type: int
Default: 10
sqs.wait_time_seconds
Whether to set the wait time. Enabling this activates long-polling. Valid values: 0 to 20.
Type: int
Default: 0
sqs.nack_visibility_timeout
Custom SQS Nack Visibility timeout in seconds. Default is 0
Type: int
Default: 0
sqs.zero_key_warn_interval
A message from which no target key can be extracted (e.g. due to a misconfigured key_path/bucket_path) is never deleted, so it's redelivered and re-evaluated repeatedly until the underlying issue is fixed. This field limits how often that condition is logged as a warning, to avoid flooding the logs; every occurrence is still logged at debug level. Set to 0s to warn on every occurrence.
Type: string
Default: "30s"