Skip to main content

使用 Lambda 与 IAM 角色

权限页面中所述,使用 Remotion Lambda 的默认方式涉及创建一个 Remotion 用户并分配策略。

这些策略允许 Lambda 使用renderMediaOnLambda()来渲染视频。这些凭证被视为长期凭证,安全性较低,在一些公司中被禁止使用。

此外,可能需要在诸如LambdaEC2和其他计算服务上执行renderMediaOnLambda(),在这些服务中,使用长期凭证不是一个选择。

AWS 提供了IAM 角色的概念作为上述问题的解决方案。当角色分配给 AWS 服务时,AWS 根据附加的策略赋予任何提升的权限,并授权角色执行诸如将文件放入 S3 存储桶之类的活动。

角色被赋予临时 AWS 凭证,如 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN 用于生成视频。这种方法增强了安全性,因为没有长期凭证残留,也无需跟踪其轮换。

以下步骤为 Lambda 函数提供了执行 renderMediaOnLambda() 的授权,避免权限问题。

先决条件

  1. 在 AWS 上运行的部署的 Lambda 函数。有一个使用CDK的示例可在此处找到。它让您了解如何在另一个 Lambda 函数中调用renderMediaOnLambda()。该函数由API Gateway触发。示例假定您了解如何使用CDK,还提供了一个写作
  2. 分配给 Lambda 函数的执行角色。
  3. 具有必要用户权限的用户策略。

设置

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_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN,这些变量具有临时权限访问 renderMediaOnLambda() 渲染视频所需的 AWS 资源。这些提升的权限来自于 remotion-executionrole-policy 中的策略语句。

note

此过程也适用于其他 AWS 计算服务,如 EC2Fargate 等。

渲染到不同的存储桶

如果您希望在渲染后将视频移动到另一个 S3 存储桶中,Lambda 函数还需要相应的权限。该过程与之前的步骤类似,但您需要创建一个新的策略语句,定义 Lambda 需要将渲染视频传输到的存储桶。

示例

使用 outName 属性来选择不同的存储桶。查看:自定义输出目的地

my-function.ts
ts
import {renderMediaOnLambda} from '@remotion/lambda/client';
 
const {bucketName, renderId} = await renderMediaOnLambda({
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.ts
ts
import {renderMediaOnLambda} from '@remotion/lambda/client';
 
const {bucketName, renderId} = await renderMediaOnLambda({
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 函数现在可以将渲染后的视频移动到另一个存储桶。

另请参阅