packages/docs/docs/lambda/setup.mdx
import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';
<YouTube minutes={18} href="https://www.youtube.com/watch?v=kFVd3KnfwYY" thumb="https://i.ytimg.com/vi/kFVd3KnfwYY/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLCJOz2mu_A24NvjFQGm6GjUVssnUQ" title="How to set up Remotion Lambda" />@remotion/lambdanpx remotion lambda policies role in the command line and copy it into the "JSON" field on AWS.remotion-lambda-policy. The other fields can be left as they are.remotion-lambda-policy and click the checkbox to assign this policy. Click next.remotion-lambda-role exactly. You can leave the other fields as is.Add usersremotion-user..env file to your project's root and add the credentials you just copied in the following format:REMOTION_AWS_ACCESS_KEY_ID=<Access key ID>
REMOTION_AWS_SECRET_ACCESS_KEY=<Secret access key>
npx remotion lambda policies user and copy into the AWS text field what gets printed.remotion-user-policy, but it can be anything.Check all user permissions and validate them against the AWS Policy simulator by executing the following command:
npx remotion lambda policies validate
For the following steps, you may execute them on the CLI, or programmatically using the Node.JS APIs.
<Tabs defaultValue="cli" values={[ { label: 'CLI', value: 'cli', }, { label: 'Node.JS', value: 'node', }, ] }> <TabItem value="cli">
Deploy a function that can render videos into your AWS account by executing the following command:
npx remotion lambda functions deploy
You can deploy a function that can render videos into your AWS account using deployFunction().
import {deployFunction} from '@remotion/lambda';
// ---cut---
const {functionName} = await deployFunction({
region: 'us-east-1',
timeoutInSeconds: 120,
memorySizeInMb: 2048,
createCloudWatchLogGroup: true,
});
The function name is returned which you'll need for rendering.
</TabItem> </Tabs>The function consists of necessary binaries and JavaScript code that can take a serve URL and make renders from it. A function is bound to the Remotion version, if you upgrade Remotion, you need to deploy a new function. A function does not include your Remotion code, it will be deployed in the next step instead.
<Tabs defaultValue="cli" values={[ { label: 'CLI', value: 'cli', }, { label: 'Node.JS', value: 'node', }, ] }> <TabItem value="cli">
Run the following command to deploy your Remotion project to an S3 bucket. Pass as the last argument the entry point of the project.
npx remotion lambda sites create src/index.ts --site-name=my-video
A Serve URL will be printed pointing to the deployed project.
When you update your Remotion code in the future, redeploy your site. Pass the same --site-name to overwrite the previous deploy. If you don't pass --site-name, a unique URL will be generated on every deploy.
First, you need to create an S3 bucket in your preferred region. If one already exists, it will be used instead:
import path from 'path';
import {deploySite, getOrCreateBucket} from '@remotion/lambda';
const {bucketName} = await getOrCreateBucket({
region: 'us-east-1',
});
Next, upload your Remotion project to an S3 bucket. Specify the entry point of your Remotion project, this is the file where registerRoot() is called.
import path from 'path';
import {deploySite, getOrCreateBucket} from '@remotion/lambda';
const {bucketName} = await getOrCreateBucket({
region: 'us-east-1',
});
// ---cut---
const {serveUrl} = await deploySite({
bucketName,
entryPoint: path.resolve(process.cwd(), 'src/index.ts'),
region: 'us-east-1',
siteName: 'my-video',
});
When you update your Remotion code in the future, redeploy your site. Pass the same siteName to overwrite the previous deploy. If you don't pass siteName, a unique URL will be generated on every deploy.
Check the concurrency limit that AWS has given to your account:
npx remotion lambda quotas
By default, it is 1000 concurrent invocations per region. However, new accounts might have a limit as low as 10. Each Remotion render may use as much as 200 functions per render concurrently, so if your assigned limit is very low, you might want to request an increase right away.
<Tabs defaultValue="cli" values={[ { label: 'CLI', value: 'cli', }, { label: 'Node.JS', value: 'node', }, ] }> <TabItem value="cli">
Take the URL you received from the step 9 - your "serve URL" - and run the following command. Also pass in the ID of the composition you'd like to render.
npx remotion lambda render <serve-url> <composition-id>
Progress will be printed until the video finished rendering. Congrats! You rendered your first video using Remotion Lambda 🚀
</TabItem> <TabItem value="node">You already have the function name from a previous step. But since you only need to deploy a function once, it's useful to retrieve the name of your deployed function programmatically before rendering a video in case your Node.JS program restarts. We can call getFunctions() with the compatibleOnly flag to get only functions with a matching version.
import {getFunctions, renderMediaOnLambda, getRenderProgress} from '@remotion/lambda/client';
const functions = await getFunctions({
region: 'us-east-1',
compatibleOnly: true,
});
const functionName = functions[0].functionName;
We can now trigger a render using the renderMediaOnLambda() function.
import {getFunctions, renderMediaOnLambda, getRenderProgress} from '@remotion/lambda/client';
const url = 'string';
const functions = await getFunctions({
region: 'us-east-1',
compatibleOnly: true,
});
const functionName = functions[0].functionName;
// ---cut---
const {renderId, bucketName} = await renderMediaOnLambda({
region: 'us-east-1',
functionName,
serveUrl: url,
composition: 'HelloWorld',
inputProps: {},
codec: 'h264',
imageFormat: 'jpeg',
maxRetries: 1,
framesPerLambda: 20,
privacy: 'public',
});
The render will now run and after a while the video will be available in your S3 bucket. You can at any time get the status of the video render by calling getRenderProgress().
import {getFunctions, renderMediaOnLambda, getRenderProgress} from '@remotion/lambda/client';
const url = 'string';
const functions = await getFunctions({
region: 'us-east-1',
compatibleOnly: true,
});
const functionName = functions[0].functionName;
const {renderId, bucketName} = await renderMediaOnLambda({
region: 'us-east-1',
functionName,
serveUrl: url,
composition: 'HelloWorld',
inputProps: {},
codec: 'h264',
imageFormat: 'jpeg',
maxRetries: 1,
framesPerLambda: 20,
privacy: 'public',
});
// ---cut---
while (true) {
await new Promise((resolve) => setTimeout(resolve, 1000));
const progress = await getRenderProgress({
renderId,
bucketName,
functionName,
region: 'us-east-1',
});
if (progress.done) {
console.log('Render finished!', progress.outputFile);
process.exit(0);
}
if (progress.fatalErrorEncountered) {
console.error('Error enountered', progress.errors);
process.exit(1);
}
}
This code will poll every second to check the progress of the video and exit the script if the render is done. Congrats! Check your S3 Bucket - you just rendered your first video using Remotion Lambda 🚀
</TabItem> </Tabs>