This project contains an example implementation and infrastructure code to both destinations SQS as well as firehose:
- Provisions necessary AWS infrastructure to receive and store Amazon Marketing Stream data, as well as confirm Stream dataset subscriptions for SQS. The Stream subscription process has been simplified now, with Kinesis Data Firehose, you no longer need to confirm your subscription.
- Subscribe to datasets and manage subscriptions using a CLI.
This is a reference implementation, and not the only definitive way to consume Amazon Marketing Stream data. Note that this implementation is subject to change and future releases may not be backwards compatible.
This application, developed using Python and the AWS Cloud Development Kit (CDK), supports two deployment options: one for SQS and another for the new destination Firehose. However, SQS is the default deployment.
The SQS application deployment provisions the following AWS infrastructure components for each dataset and region combination:
- An SQS queue (StreamIngressQueue) that receives initial messages from Stream.
- A lambda (StreamFanoutLambda) that identifies whether a message contains subscription details or data.
- A second SQS queue (SubscriptionConfirmationQueue) that forwards subscription confirmation messages to a second lambda (SubscriptionConfirmationLambda) that confirms the subscription.
- An SNS topic (StreamFanoutDataTopic that) forwards data through a KinesisDateFirehouse (StreamStorageFirehose) to an S3 bucket (StreamStorageBucket) where the data is stored.
Note: The provisioning of each SQS queue also includes an associated dead-letter queue.
The Firehose application deployment provisions the following AWS infrastructure components for each dataset and region combination:
- A KinesisDateFirehouse (StreamStorageFirehose).
- An S3 bucket (StreamStorageBucket) where the data is stored.
- A [IAM Roles] (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) (FirehoseSubscriberRole) and (FirehoseSubscriptionRole) so that amazon marketing stream can send the messages to KinesisDateFirehouse.
Learn how to set up the reference application by watching our video demo.
This package includes following templates for all available datasets for advertising regions NA, EU, and FE. All NA stacks will be deployed in AWS region us-east-1, EU stacks will be deployed in AWS region eu-west-1, and FE stacks will be deployed in AWS region us-west-2 to minimize latency of message delivery. For more information on datasets, see the Stream data guide.
- AmzStream-NA-sp-traffic
- AmzStream-NA-sp-conversion
- AmzStream-NA-budget-usage
- AmzStream-NA-sd-traffic
- AmzStream-NA-sd-conversion
- AmzStream-NA-sb-traffic
- AmzStream-NA-sb-conversion
- AmzStream-NA-sb-clickstream
- AmzStream-NA-sb-rich-media
- AmzStream-NA-campaigns
- AmzStream-NA-adgroups
- AmzStream-NA-ads
- AmzStream-NA-targets
- AmzStream-NA-sponsored-ads-campaign-diagnostics-recommendations
- AmzStream-NA-sp-budget-recommendations
- AmzStream-EU-sp-traffic
- AmzStream-EU-sp-conversion
- AmzStream-EU-budget-usage
- AmzStream-EU-sd-traffic
- AmzStream-EU-sd-conversion
- AmzStream-EU-sb-traffic
- AmzStream-EU-sb-conversion
- AmzStream-EU-sb-clickstream
- AmzStream-EU-sb-rich-media
- AmzStream-EU-campaigns
- AmzStream-EU-adgroups
- AmzStream-EU-ads
- AmzStream-EU-targets
- AmzStream-EU-sponsored-ads-campaign-diagnostics-recommendations
- AmzStream-EU-sp-budget-recommendations
- AmzStream-FE-sp-traffic
- AmzStream-FE-sp-conversion
- AmzStream-FE-budget-usage
- AmzStream-FE-sd-traffic
- AmzStream-FE-sd-conversion
- AmzStream-FE-sb-traffic
- AmzStream-FE-sb-conversion
- AmzStream-FE-sb-clickstream
- AmzStream-FE-sb-rich-media
- AmzStream-FE-campaigns
- AmzStream-FE-adgroups
- AmzStream-FE-ads
- AmzStream-FE-targets
- AmzStream-FE-sponsored-ads-campaign-diagnostics-recommendations
- AmzStream-FE-sp-budget-recommendations
- AWS account
- AWS Cloud Development Kit (CDK)
- Python 3.7 or later including pip and virtualenv
We recommend exploring the contents of this project and familiarizing yourself with the AWS infrastructure before deploying.
-
Initialize your project and activate a virtualenv. The
cdk.jsonfile tells the CDK Toolkit how to execute your app. This project is set up like a standard Python project. The initialization process creates a virtualenv within this project, stored under the .venv directory. To create the virtualenv, it assumes that there is apython3executable in your path with access to thevenvpackage. If the automatic creation of the virtualenv fails, you can always create the virtualenv manually once the init process completes.Manually create a virtualenv on MacOS and Linux
Creating a virtual environment
python3 -m venv .venvAfter the init process completes and the virtualenv is created, you can use the following step to activate your virtualenv.
source .venv/bin/activateManually create a virtualenv on Windows
% .venv\Scripts\activate.bat -
Install the required dependencies.
pip install -r requirements.txt -
Synthesize the CloudFormation templates for this code.
cdk synthTo view the CloudFormation templates created by the synthesize step.
cdk ls -
Deploy CloudFormation templates.
Depending on your requirements, you can choose to deploy all CloudFormation templates
SQS -
cdk deploy --allFirehose -
cdk deploy --all --context delivery_type=firehoseor individual templates
SQS -
cdk deploy AmzStream-NA-sp-trafficFirehose -
cdk deploy AmzStream-NA-sp-traffic --context delivery_type=firehoseAt the end of deployment, your output should resemble:
SQS Outputs: AmzStream-NA-sp-traffic.IngressIngressQueue91B67342 = arn:aws:sqs:us-east-1:2xxxxxxxxxxx:AmzStream-NA-sp-traffic-IngressQueue26236266-Jvxxxxxxxxxx AmzStream-NA-sp-traffic.StorageLandingZoneBucketFE2101CB = arn:aws:s3:::amzstream-na-sp-traffic-storagelz10f6c360-1hxxxxxxxxxxx Stack ARN: arn:aws:cloudformation:us-east-1:2xxxxxxxxxxx:stack/AmzStream-NA-sp-traffic/57151cc0-b625-11ed-a641-12730e200e31Firehose Outputs: AmzStream-NA-sb-traffic.FirehoseSubscriberRoleInfraArn3358A9BC = arn:aws:iam::88xxxxxxxx:role/sb-traff-NA-subscriber AmzStream-NA-sb-traffic.FirehoseSubscriptionRoleInfraArn22E3DAAD = arn:aws:iam::88xxxxxxxx:role/sb-traff-NA-subscription AmzStream-NA-sb-traffic.StorageDeliveryStreamArnBB2306AC = arn:aws:firehose:us-east-1:88xxxxxxxx:deliverystream/AmzStream-NA-sb-traffic-StorageFirehoseEEA939E5-rDi6fvblOARo AmzStream-NA-sb-traffic.StorageLandingZoneBucketFE2101CB = arn:aws:s3:::amzstream-na-sb-traffic-storagelz10f6c360-4xbrfa1i3lxh Stack ARN: arn:aws:cloudformation:us-east-1:88xxxxxxxx:stack/AmzStream-NA-sb-traffic/e63f06f0-0790-11ef-b509-127247d88f9bNote:
- This example uses
AmzStream-NA-sp-trafficas an example. AmzStream-NA-sp-traffic.IngressIngressQueue91B67342is the name of the example queue that will receive messages for datasetsp-trafficfrom NA region.arn:aws:sqs:us-east-1:2xxxxxxxxxxx:AmzStream-NA-sp-traffic-IngressQueue26236266-Jvxxxxxxxxxxis the ARN of the example queue and should be used for fielddestinationArnwhile calling the subscription API as listed in the subscription step of the onboarding guide.AmzStream-NA-sp-traffic.StorageLandingZoneBucketFE2101CBis the name of the example S3 bucket that will store all the received messages for this dataset.
- This example uses
cdk lsLists all stacks in the appcdk synthEmits the synthesized CloudFormation templatecdk bootstrapDeploys the CDK toolkit stack into an AWS environmentcdk deployDeploys this stack to your default AWS account/regioncdk diffCompares deployed stack with current statecdk docsOpens CDK documentationcdk destroyDestroys this stack to your default AWS account/region
We provide a Stream subscription management command line tool that supports following commands:
- Create - Creates an Amazon Marketing Stream subscription.
- Get - Gets information on a Amazon Marketing Stream subscription by ID.
- List - Lists all Amazon Marketing Stream subscriptions associated with your Amazon Advertising API profile.
- Update - Updates an Amazon Marketing Stream subscription by ID.
In order to use the CLI, you must create a credentials.yml file with your Amazon Ads API credentials. If you don't have credentials for the Ads API, review the Onboarding process.
- macOS and Other Unix:
~/.config/python-ad-api - Windows:
%APPDATA%\python-ad-apiwhere the APPDATA environment variable falls back to%HOME%\AppData\Roamingif undefined
For more information, see Python Confuse module help.
Example: ~/.config/python-ad-api/credentials.yml
version: '1.0'
default:
refresh_token: 'your-refresh-token'
client_id: 'your-client-id'
client_secret: 'your-client-secret'
profile_id: 'your-profile-id'Once you start receiving Stream data in AWS, you can learn more about aggregating and querying Stream data in our documentation.
You can view instructions for using the CLI using python -m amz_stream_cli --help.
Example:
% python -m amz_stream_cli --help
Usage: amz_stream_cli [OPTIONS] COMMAND [ARGS]...
╭─ Options ──────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --version -v Show the application's version and exit. │
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or customize the installation. │
│ --help Show this message and exit. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ─────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ create Creates Amazon Marketing Stream subscription. │
│ get Gets information on specific Amazon Marketing Stream subscription by ID. │
│ list Lists all Amazon Marketing Stream subscriptions associated with your Amazon Advertising API account. │
│ update Updates specific Amazon Marketing Stream subscription by ID. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
For help on individual commands, use the following:
python -m amz_stream_cli create --helppython -m amz_stream_cli get --helppython -m amz_stream_cli list --helppython -m amz_stream_cli update --help

