CloudFormation template to convert WEBM audio files to MP3 files.
MIT License
cloudformation-webm-mp3
is an AWS SAM + CloudFormation template designed to ingest WEBM audio
files and convert them to MP3 files. It sends a notification through SNS to keep track of
progress, generate information about the audio file (like duration) and completion.
It's simple! Click this fancy button:
Then give the stack a name, and configure it:
Parameter | Required | Default Value | Description |
---|---|---|---|
InputBucketName | Yes | The name of the bucket to use for audio inputs. This bucket MUST NOT already exist. | |
OutputBucketName | Yes | The name of the bucket to use for output audio files. This bucket MUST already exist. | |
SubnetNames | Yes | A comma-separated list of VPC subnets to launch the Fargate container in. | |
SecurityGroupNames | Yes | A comma-separated list of VPC security groups (that have access to the internet) to launch the Fargate container in. | |
ContainerName | No | webm-convert-audio |
The name of the Fargate container. |
Output | Description |
---|---|
InputBucket | The name of the bucket where audio files should be uploaded. |
InputBucketArn | The ARN for the bucket where audio files should be uploaded. |
Topic | The ARN for the SNS Topic to subscribe to for pipeline notifications. |
S3Topic | The ARN for the SNS Topic to subscribe to for object creation notifications from the input bucket. |
Add something like this underneath resources:
videoThumbnailStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: https://sammarks-cf-templates.s3.amazonaws.com/webm-mp3/VERSION/template.yaml
Parameters:
InputBucketName: test-input-bucket
OutputBucketName: test-output-bucket
SubnetNames: subnet-aaaaa,subnet-bbbbb
SecurityGroupNames: sg-aaaaa,sg-bbbbb
ContainerName: webm-convert-audio
Note: This stack will require the CAPABILITY_AUTO_EXPAND
capability when deploying
the parent stack with CloudFormation. If you are using the Serverless framework, you can
"trick" it into adding the required capabilities by adding this to your serverless.yaml
:
resources:
Transform: 'AWS::Serverless-2016-10-31' # Trigger Serverless to add CAPABILITY_AUTO_EXPAND
Resources:
otherResource: # ... all of your original resources
A quick note on regions: If you are deploying this stack in a region other than us-east-1
,
you need to reference the proper region S3 bucket as we're deploying Lambda functions. Just
add the region suffix to the template URL, so this:
https://sammarks-cf-templates.s3.amazonaws.com/webm-mp3/VERSION/template.yaml
becomes this:
https://sammarks-cf-templates-us-east-2.s3.amazonaws.com/webm-mp3/VERSION/template.yaml
S3 does not allow two separate Lambda functions to be subscribed to the same event types on a single bucket. Because of this, the template creates an SNS topic to serve as the messenger for the S3 notifications, and the internal Lambda function subscribes to that SNS topic.
Because of this, if you want to subscribe to the object creation events in your
own Lambda functions, simply create a Lambda function that references the
S3Topic
output of this stack.
Whenever an audio file is uploaded to the input bucket, it goes through the following process:
.webm
- it will throwffmpeg
to convert the container from WEBM to MP3, and then uploads the resultSee cloudformation-webm-mp4 for more information.
Each time a release is made in this repository, the corresponding template is available at:
https://sammarks-cf-templates.s3.amazonaws.com/webm-mp3/VERSION/template.yaml
On upgrading: I actually recommend you lock the template you use to a specific version. Then, if you want to update to a new version, all you have to change in your CloudFormation template is the version and AWS will automatically delete the old stack and re-create the new one for you.
webm
audio files to mp3
files.The inspiration for this template was to easily convert audio files generated using the MediaRecorder APIs to MP3 files for broader consumption on mobile devices.
Running a Docker container with ffmpeg
installed inside AWS Fargate to achieve this becomes
immensely cheaper than using something like AWS' ElementalMedia services because converting
audio files is quick and easy with the smaller file sizes, so
we don't need the massive amount of CPU power something like AWS' ElementalMedia provides.