使用 Lambda 与 IAM 角色
如权限页面
中所述,使用 Remotion Lambda 的默认方式涉及创建一个 Remotion 用户并分配策略。
这些策略允许 Lambda 使用renderMediaOnLambda()
来渲染视频。这些凭证被视为长期凭证,安全性较低,在一些公司中被禁止使用。
此外,可能需要在诸如Lambda
、EC2
和其他计算服务
上执行renderMediaOnLambda()
,在这些服务中,使用长期凭证不是一个选择。
AWS 提供了IAM 角色的概念作为上述问题的解决方案。当角色分配给 AWS 服务时,AWS 根据附加的策略赋予任何提升的权限,并授权角色执行诸如将文件放入 S3 存储桶之类的活动。
角色被赋予临时 AWS 凭证,如 AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_SESSION_TOKEN
用于生成视频。这种方法增强了安全性,因为没有长期凭证残留,也无需跟踪其轮换。
以下步骤为 Lambda 函数提供了执行 renderMediaOnLambda()
的授权,避免权限问题。
先决条件
- 在 AWS 上运行的部署的 Lambda 函数。有一个使用
CDK
的示例可在此处
找到。它让您了解如何在另一个 Lambda 函数中调用renderMediaOnLambda()
。该函数由API Gateway触发。示例假定您了解如何使用CDK
,还提供了一个写作。 - 分配给 Lambda 函数的执行角色。
- 具有必要用户权限的用户策略。
设置
1. 创建角色策略
- 转到 AWS 管理控制台中的 IAM 策略部分
- 点击“创建策略”
- 点击 JSON
- 复制下面的 JSON 策略模板:
显示最新 Remotion Lambda 版本的完整角色权限 JSON 文件
{ "Version": "2012-10-17", "Statement": [ { "Sid": "HandleQuotas", "Effect": "Allow", "Action": [ "servicequotas:GetServiceQuota", "servicequotas:GetAWSDefaultServiceQuota", "servicequotas:RequestServiceQuotaIncrease", "servicequotas:ListRequestedServiceQuotaChangeHistoryByQuota" ], "Resource": [ "*" ] }, { "Sid": "PermissionValidation", "Effect": "Allow", "Action": [ "iam:SimulatePrincipalPolicy" ], "Resource": [ "*" ] }, { "Sid": "LambdaInvokation", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::*:role/remotion-lambda-role" ] }, { "Sid": "Storage", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:DeleteObject", "s3:PutObjectAcl", "s3:PutObject", "s3:CreateBucket", "s3:ListBucket", "s3:GetBucketLocation", "s3:PutBucketAcl", "s3:DeleteBucket", "s3:PutBucketOwnershipControls", "s3:PutBucketPublicAccessBlock", "s3:PutLifecycleConfiguration" ], "Resource": [ "arn:aws:s3:::remotionlambda-*" ] }, { "Sid": "BucketListing", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": [ "*" ] }, { "Sid": "FunctionListing", "Effect": "Allow", "Action": [ "lambda:ListFunctions", "lambda:GetFunction" ], "Resource": [ "*" ] }, { "Sid": "FunctionManagement", "Effect": "Allow", "Action": [ "lambda:InvokeAsync", "lambda:InvokeFunction", "lambda:CreateFunction", "lambda:DeleteFunction", "lambda:PutFunctionEventInvokeConfig", "lambda:PutRuntimeManagementConfig", "lambda:TagResource" ], "Resource": [ "arn:aws:lambda:*:*:function:remotion-render-*" ] }, { "Sid": "LogsRetention", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:PutRetentionPolicy" ], "Resource": [ "arn:aws:logs:*:*:log-group:/aws/lambda/remotion-render-*" ] }, { "Sid": "FetchBinaries", "Effect": "Allow", "Action": [ "lambda:GetLayerVersion" ], "Resource": [ "arn:aws:lambda:*:678892195805:layer:remotion-binaries-*", "arn:aws:lambda:*:580247275435:layer:LambdaInsightsExtension*" ] } ] }
- 点击下一步。在标签页上,您无需填写任何内容。再次点击下一步。
- 将策略命名为
remotion-executionrole-policy
。其他字段可以保持不变。
2. 将策略分配给 Lambda 执行角色
- 转到 AWS 管理控制台
- 导航至 Lambda(更改为您的函数区域)
- 选择 函数
- 选择您的 Lambda 函数
- 选择“配置”选项卡
- 选择“权限”选项卡
- 点击
Execution role
下的角色 - 在重定向时,点击“权限”选项卡
- 点击
添加权限
- 附加策略
- 找到策略,即
remotion-executionrole-policy
- 选择策略
- 点击
附加策略
按钮。
通过将 策略
分配给 Lambda 执行角色,现在可以在没有权限问题的情况下执行 renderMediaOnLambda()
API。
在后台,当执行 Lambda 函数时,会提供环境变量,如 AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_SESSION_TOKEN
,这些变量具有临时权限访问 renderMediaOnLambda()
渲染视频 所需的 AWS 资源。这些提升的权限来自于 remotion-executionrole-policy
中的策略语句。
此过程也适用于其他 AWS 计算服务,如 EC2
、Fargate
等。
渲染到不同的存储桶
如果您希望在渲染后将视频移动到另一个 S3 存储桶中,Lambda 函数还需要相应的权限。该过程与之前的步骤类似,但您需要创建一个新的策略语句,定义 Lambda 需要将渲染视频传输到的存储桶。
示例
使用 outName
属性来选择不同的存储桶。查看:自定义输出目的地
my-function.tsts
import {renderMediaOnLambda } from '@remotion/lambda/client';const {bucketName ,renderId } = awaitrenderMediaOnLambda ({region : 'us-east-1',functionName : 'remotion-render-bds9aab',composition : 'MyVideo',serveUrl :'https://remotionlambda-qg35eyp1s1.s3.eu-central-1.amazonaws.com/sites/bf2jrbfkw',codec : 'h264',outName : {key : 'my-output',bucketName : 'output-bucket',},});
my-function.tsts
import {renderMediaOnLambda } from '@remotion/lambda/client';const {bucketName ,renderId } = awaitrenderMediaOnLambda ({region : 'us-east-1',functionName : 'remotion-render-bds9aab',composition : 'MyVideo',serveUrl :'https://remotionlambda-qg35eyp1s1.s3.eu-central-1.amazonaws.com/sites/bf2jrbfkw',codec : 'h264',outName : {key : 'my-output',bucketName : 'output-bucket',},});
在上面的示例中,renderMediaOnLambda()
被配置为将渲染后的视频输出到 transfer-to-this-bucket-after-render
存储桶。以下步骤允许 Lambda 将文件移动到另一个存储桶。
步骤
- 再次将策略分配给 Lambda 执行角色。前往 AWS 管理控制台 并:
- 导航至 Lambda (更改为您的函数区域)
- 函数
- 选择您的 Lambda 函数
- 配置选项卡
- 权限选项卡
- 点击
执行角色
下的角色 - 重定向后,点击权限选项卡
- 点击
添加权限
- 点击 "创建内联策略"
- 点击 "JSON" 选项卡
添加类似于以下内容的策略声明,定义 Lambda 需要将渲染后的视频传输到的存储桶。
json
{"Version": "2012-10-17","Statement": [{"Action": ["s3:PutObject"],"Resource": ["arn:aws:s3:::{bucketname}", "arn:aws:s3:::{bucketname}/*"],"Effect": "Allow"}]}
json
{"Version": "2012-10-17","Statement": [{"Action": ["s3:PutObject"],"Resource": ["arn:aws:s3:::{bucketname}", "arn:aws:s3:::{bucketname}/*"],"Effect": "Allow"}]}
- 用您想要将渲染后的视频移动到的存储桶的名称替换
{bucketname}
- 点击
审阅策略
- 点击
保存更改
当渲染过程完成时,Lambda 函数现在可以将渲染后的视频移动到另一个存储桶。