如何将托管策略附加到无服务器框架中的 lambda 函数

How to attach a managed policy to a lambda function in serverless framework

如何将托管策略附加到 lambda 函数?

我试过了:

provider:
  name: aws
  role: arn:aws:iam::aws:policy/AmazonCognitoReadOnly

但这导致了以下错误:

An error occurred while provisioning your stack: GaDashextractLambdaFunction - 1 validation error detected: Value 'arn:aws:iam::aws:policy/AmazonCognitoReadOnly' at 'role' failed to satisfy constraint: Member must satisfy regular expression pattern: arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@-_/]+.

注意错误 -- 它期望 role 而不是 policy

IAM 策略是定义权限的文档,不能直接附加到 lambda 函数。创建一个 IAM Role and attach the managed policy to the role。将角色视为策略的容器;策略不能直接附加到 lambda 函数,但角色可以。您可以自由地将托管和内联策略附加和分离到您的角色。

选项 1:使用预定义策略从 AWS 控制台修复此错误:

  • 为您的 lambda 函数创建一个新的 IAM 角色。
  • 在创建过程中,附加 AmazonCognitoReadOnly 托管策略。
  • role 定义中的 ARN 替换为新角色的 ARN。

选项 2:在 serverless.yml 中定义 AmazonCognitoReadOnly 策略的操作:

这有效地将托管策略转换为内联策略。 警告:这是未经测试的。

provider:
  ...
  iamRoleStatements:
    - Effect: Allow
      Action:
        - cognito-identity:Describe*
        - cognito-identity:Get*
        - cognito-identity:List*
        - cognito-idp:Describe*
        - cognito-idp:AdminGetUser
        - cognito-idp:List*
        - cognito-sync:Describe*
        - cognito-sync:Get*
        - cognito-sync:List*
        - iam:ListOpenIdConnectProviders
        - iam:ListRoles
        - sns:ListPlatformApplication
      Resource: *

进一步阅读:

可以。只需在角色资源的 ManagedPolicyArns 中提供 ARN。

Resources:
  RoleName:
    ManagedPolicyArns:
      - "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess"

适用于所有功能的策略:

provider:
  name: aws
  iamManagedPolicies:
    - "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess"