--- image: /generated/articles-docs-lambda-setup.png id: setup title: Setup slug: /lambda/setup crumb: 'Lambda' --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; ## 1. Install `@remotion/lambda` ## 2. Create role policy - Go to [AWS account IAM Policies section](https://console.aws.amazon.com/iamv2/home?#/policies) - Click on "Create policy" - Click on JSON - In your project, type `npx remotion lambda policies role` in the command line and copy it into the "JSON" field on AWS. - Click next. Give the policy **exactly** the name `remotion-lambda-policy`. The other fields can be left as they are. - On the tags page, you don't need to fill in anything. Click next again. ## 3. Create a role - Go to [AWS account IAM Roles section](https://console.aws.amazon.com/iamv2/home#/roles) - Click "Create role". - Under "Use cases", select "Lambda". Click next. - Under "Permissions policies", filter for `remotion-lambda-policy` and click the checkbox to assign this policy. Click next. - In the final step, name the role `remotion-lambda-role` **exactly**. You can leave the other fields as is. - Click "Create role" to confirm. ## 4. Create a user - Go to [AWS account IAM Users section](https://console.aws.amazon.com/iamv2/home#/users) - Click `Add users` - Enter any username, such as `remotion-user`. - **Don't check** the "Enable console access" option. You don't need it. - Click "Next". - Click "Next" again without changing any settings. You should now be on the "Review and Create" step. - Click "Create user". ## 5. Create an access key for the user - Go to [AWS account IAM Users section](https://console.aws.amazon.com/iamv2/home#/users) - Click on the name of the user that was created in step 4. - Navigate to the "Security Credentials" tab, and scroll down to the "Access Keys" section. - Click the "Create access key" button. - Select "Application running on an AWS compute service". - Ignore warnings that might appear and check the "I understand the recommendations..." checkbox. - Click "Next". - Click "Create access key". - Add a `.env` file to your project's root and add the credentials you just copied in the following format: ```txt title=".env" REMOTION_AWS_ACCESS_KEY_ID= REMOTION_AWS_SECRET_ACCESS_KEY= ``` ## 6. Add permissions to your user - Go to [AWS account IAM Users section](https://console.aws.amazon.com/iamv2/home#/users) - Select the user you just created. - Click "Add inline policy" under the "Add Permissions" dropdown in the "Permissions policies" panel. - Click the tab "JSON". - Enter in your terminal: `npx remotion lambda policies user` and copy into the AWS text field what gets printed. - Click "Review policy". - Give the policy a name. For example `remotion-user-policy`, but it can be anything. - Click "Create policy" to confirm. ## 7. Optional: Validate the permission setup Check all user permissions and validate them against the AWS Policy simulator by executing the following command: ```bash npx remotion lambda policies validate ```
For the following steps, you may execute them on the CLI, or programmatically using the Node.JS APIs. ## 8. Deploy a function Deploy a function that can render videos into your AWS account by executing the following command: ```bash npx remotion lambda functions deploy ``` You can deploy a function that can render videos into your AWS account using [`deployFunction()`](/docs/lambda/deployfunction). ```ts twoslash 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. The function consists of necessary binaries and JavaScript code that can take a [serve URL](/docs/terminology/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](/docs/lambda/upgrading). A function does not include your Remotion code, it will be deployed in the next step instead. ## 9. Deploy a site Run the following command to deploy your Remotion project to an S3 bucket. Pass as the last argument the [entry point](/docs/terminology/entry-point) of the project. ```bash npx remotion lambda sites create src/index.ts --site-name=my-video ``` A [Serve URL](/docs/terminology/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`](/docs/lambda/cli/sites/create#--site-name) to overwrite the previous deploy. If you don't pass [`--site-name`](/docs/lambda/cli/sites/create#--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: ```ts twoslash 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()`](/docs/register-root) is called. ```ts twoslash 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`](/docs/lambda/deploysite#sitename) to overwrite the previous deploy. If you don't pass [`siteName`](/docs/lambda/deploysite#sitename), a unique URL will be generated on every deploy. ## 10. Check AWS concurrency limit 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`](/docs/lambda/troubleshooting/rate-limit#new-accounts-using-aws-lambda). 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](/docs/lambda/troubleshooting/rate-limit#request-an-increase). ## 11. Render a video 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](/docs/composition) you'd like to render. ```bash npx remotion lambda render ``` Progress will be printed until the video finished rendering. Congrats! You rendered your first video using Remotion Lambda 🚀 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()`](/docs/lambda/getfunctions) with the `compatibleOnly` flag to get only functions with a matching version. ```ts twoslash 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()`](/docs/lambda/rendermediaonlambda) function. ```ts twoslash 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()`](/docs/lambda/getrenderprogress). ```ts twoslash 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](https://s3.console.aws.amazon.com/s3/) - you just rendered your first video using Remotion Lambda 🚀 ## Next steps - Select [which region(s)](/docs/lambda/region-selection) you want to run Remotion Lambda in. - Familiarize yourself with the CLI and the Node.JS APIs (list in sidebar). - Learn how to [upgrade Remotion Lambda](/docs/lambda/upgrading). - Before going live, go through the [Production checklist](/docs/lambda/checklist). - If you have any questions, go through the [FAQ](/docs/lambda/faq) or ask in our [Discord channel](https://remotion.dev/discord)