如何提供对 Lambda 函数的精细访问权限?

5 分钟阅读
0

我想向 AWS Identity and Access Management (IAM) 用户授予特定 AWS Lambda 函数的读写权限。

解决方法

使用 IAM 策略为 IAM 用户配置创建、删除、修改、调用和监控 Lambda 函数以及查看 Lambda 函数配置所需的权限。

以下策略示例将支持资源级权限的 Lambda API 操作限制为仅 Resource 元素中列出的特定 Lambda 函数。您可以在 API 操作中使用 Condition 元素来识别 IAM 策略中的 Lambda 函数。

对于不支持资源级权限的 API 操作,必须在 Resource 元素中使用通配符 (*)。您不能应用特定于 Lambda 的条件键。有关详细信息,请参阅 AWS Lambda 的操作、资源和条件键

Resource 元素使用 ARN 来标识该语句适用的资源。例如,当 ActionInvoke 时,Resource 值为函数 ARN。IAM 会将此 ARN 与 Invoke 请求的 FunctionNameQualifier 参数中的函数 ARN 进行匹配。有关不同版本 Lambda 中的 ARN 的详细信息,请参阅使用版本

如果您使用多个 Lambda 版本,则无需添加每个 Lambda ARN。可以改为在 Resources 元素中包含通配符 (*):

arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:LAMBDA_FUNCTION_NAME:*

**注意:**请将 AWS_REGION:AWS_ACCOUNT_ID 替换为您的 Lambda ARN,将 LAMBDA_FUNCTION_NAME 替换为 Lambda 函数名称。

在以下示例 IAM 策略中,替换以下值:

  • AWS_ACCOUNT_ID 替换为您的 AWS 账户 ID
  • LAMBDA_FUNCTION_NAME 替换为您的 Lambda 函数名称
  • IAM_USER_NAME 替换为您为其提供 Lambda 访问权限的 IAM 用户
  • AWS_REGION 替换为您的 AWS 区域
  • KEY_ID 替换为您的 AWS Key Management Service (AWS KMS) 密钥
  • IAM_ROLE_NAME 替换为您的 IAM 角色
  • S3_BUCKET_NAME 替换为您的 Amazon Simple Storage Service (Amazon S3) 存储桶名称

创建 Lambda 函数所需的权限

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

要使用 AWS CLILambda 控制台创建 Lambda 函数,您必须拥有 lambda:CreateFunctioniam:PassRole 权限。有关策略示例,请参阅 Lambda 的基于身份的 IAM 策略

以下示例策略允许 API 调用方创建 Lambda 函数,并将 IAM 角色作为该函数的 Lambda 执行角色传递:

{  "Version": "2012-10-17",  "Statement": [
    {
      "Sid": "PermissionToCreateFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction"
      ],
      "Resource": [
        "arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:LAMBDA_FUNCTION_NAME"
      ]
    },
    {
      "Sid": "PermissionToPassARole",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": "arn:aws:iam::AWS_ACCOUNT_ID:role/IAM_ROLE_NAME"
    }
  ]
}

如果您将 Lambda 函数代码存储在 S3 存储桶中,请添加策略以向 Amazon S3 授予 IAM 策略权限。

策略示例:

{  "Sid": "PermissionToUploadCodeFromS3",
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::S3_BUCKET_NAME/FileName.zip"
}

**注意:**请将 FileName.zip 替换为您的 Lambda 函数代码 .zip 文件。

要查看和更新该函数,必须添加读取级 API 操作和权限。

策略示例:

{  "Version": "2012-10-17",  "Statement": [
    {
      "Sid": "PermissionsToViewFunctionsInConsole",
      "Effect": "Allow",
      "Action": [
        "lambda:ListFunctions",
        "lambda:GetAccountSettings"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PermissionsToCreateAndUpdateFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:GetFunction",
        "lambda:ListTags"
        "lambda:UpdateFunctionCode"
      ],
      "Resource": [
        "arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:LAMBDA_FUNCTION_NAME"
      ]
    },
    {
      "Sid": "PermissionToListExistingRoles",
      "Effect": "Allow",
      "Action": [
        "iam:ListRoles"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PermissionToPassARole",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": "arn:aws:iam::AWS_ACCOUNT_ID:role/IAM_ROLE_NAME"
    }
  ]
}

要在 Lambda 函数创建过程中创建 IAM 角色,请添加以下 IAM 权限:

{  "Sid": "PermmissionsToCreateAndUpdateARole",
  "Effect": "Allow",
  "Action": [
    "iam:CreateRole",
    "iam:CreatePolicy",
    "iam:PutRolePolicy",
    "iam:AttachRolePolicy"
  ],
  "Resource": "*"
}

删除 Lambda 函数所需的权限

要删除 Lambda 函数,请向 IAM 策略添加以下权限:

{  "Version": "2012-10-17",  "Statement": [
    {
      "Sid": "PermissionToDeleteFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:DeleteFunction"
      ],
      "Resource": [
        "arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:LAMBDA_FUNCTION_NAME"
      ]
    }
  ]
}

要使用 Lambda 控制台删除函数,请向 IAM 策略添加 Lambda 读取访问权限:

{  "Version": "2012-10-17",  "Statement": [
    {
      "Sid": "PermissionsToViewFunctionsInConsole",
      "Effect": "Allow",
      "Action": [
        "lambda:ListFunctions",
        "lambda:GetAccountSettings"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PermissionToDeleteFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:DeleteFunction"
      ],
      "Resource": [
        "arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:LAMBDA_FUNCTION_NAME"
      ]
    }
  ]
}

查看 Lambda 函数的配置详细信息所需的权限

要允许用户查看 Lambda 函数的配置详细信息,请向 IAM 策略添加以下权限:

{  "Version": "2012-10-17",  "Statement": [
    {
      "Sid": "ActionsWhichSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:GetFunction",
        "lambda:ListTags",
        "lambda:TagResource",
        "lambda:GetFunctionConfiguration",
        "lambda:GetPolicy",
        "lambda:GetAlias",
        "lambda:ListVersionsByFunction",
        "lambda:ListAliases"
      ],
      "Resource": [
        "arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:LAMBDA_FUNCTION_NAME"
      ]
    },
    {
      "Sid": "ActionsWhichDoNotSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:ListTags",
        "lambda:GetEventSourceMapping",
        "lambda:ListEventSourceMappings"
      ],
      "Resource": "*"
    }
  ]
}

**注意:**根据您要授予的读取访问权限级别,您可以添加上述所有权限或仅添加其中部分权限。如果您使用的是 Lambda 层,则您还可以添加 lambda:GetLayerVersionlambda:ListLayerVersions 权限。

要使用 Lambda 控制台查看函数的配置详细信息,请向 IAM 策略添加以下权限:

{  "Sid": "PermissionsToViewFunctionsInConsole",
  "Effect": "Allow",
  "Action": [
    "lambda:ListFunctions",
    "lambda:GetAccountSettings"
  ],
  "Resource": "*"
}

Lambda 控制台会在 Lambda 函数上使用标签,允许您按标签筛选 Lambda 函数。要使用标签,请向 IAM 策略添加以下权限:

{  "Sid": "PermissionsToFilterFunctionsByTags",
  "Effect": "Allow",
  "Action": [
     "tag:GetResources"
  ],
  "Resource": "*"
}

Lambda 控制台会显示与 Lambda 函数关联的 IAM 角色的详细信息以及该函数角色有权访问的资源的详细信息。要查看详细信息,请向 IAM 策略添加以下权限:

{  "Sid": "PermissionsToViewRolesAndPolicies",
  "Effect": "Allow",
  "Action": [
    "iam:GetPolicy",
    "iam:GetPolicyVersion",
    "iam:GetRolePolicy",
    "iam:ListRoles",
    "iam:ListRolePolicies",
    "iam:ListAttachedRolePolicies"
  ],
  "Resource": "*"
}

如果您有其他要求,则可能需要向其他 AWS 服务授予额外权限

修改 Lambda 函数所需的权限

要允许用户修改 Lambda 函数,请向 IAM 策略添加以下权限:

{  "Version": "2012-10-17",  "Statement": [
    {
      "Sid": "ActionsWhichSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:AddPermission",
        "lambda:RemovePermission",
        "lambda:CreateAlias",
        "lambda:UpdateAlias",
        "lambda:DeleteAlias",
        "lambda:UpdateFunctionCode",
        "lambda:UpdateFunctionConfiguration",
        "lambda:PutFunctionConcurrency",
        "lambda:DeleteFunctionConcurrency",
        "lambda:PublishVersion",
        "lambda:UpdateFunctionEventInvokeConfig",
        "lambda:PutFunctionEventInvokeConfig"
      ],
      "Resource": "arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:LAMBDA_FUNCTION_NAME"
    },
    {
      "Sid": "ActionsWhichSupportCondition",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateEventSourceMapping",
        "lambda:UpdateEventSourceMapping",
        "lambda:DeleteEventSourceMapping"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionArn": "arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:LAMBDA_FUNCTION_NAME"
        }
      }
    },
    {
      "Sid": "ActionsWhichDoNotSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:UntagResource",
        "lambda:TagResource"
      ],
      "Resource": "*"
    }
  ]
}

**注意:**根据您要授予的写入权限级别,您可以添加上述所有权限或仅添加其中部分权限。

要限制访问权限,请向附加策略中包含的主体添加 lambda:AddPermissionlambda:RemovePermission。您还可以将 lambda:UpdateEventSourceMappinglambda:DeleteEventSourceMapping 限制为特定的事件源映射。

要使用客户自主管理型密钥加密环境变量,请向 IAM 策略添加以下 AWS KMS 权限:

{  "Sid": "PermissionsForCryptoOperations",
  "Effect": "Allow",
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:CreateGrant"
  ],
  "Resource": "arn:aws:kms:AWS_REGION:AWS_ACCOUNT_ID:key/KEY_ID"
},
{
  "Sid": "PermissionsToListExistingKeys",
  "Effect": "Allow",
  "Action": [
    "kms:ListKeys",
    "kms:ListAliases"
  ],
  "Resource": "*"
}

要使用 Lambda 控制台修改 Lambda 函数的配置,请向 IAM 策略添加以下权限:

{  "Sid": "PermissionsToViewFunctionsInConsole",
  "Effect": "Allow",
  "Action": [
    "lambda:ListFunctions",
    "lambda:GetAccountSettings"
  ],
  "Resource": "*"
}

调用 Lambda 函数所需的权限

要手动调用 Lambda 函数,请向 IAM 策略添加以下权限:

{  "Version": "2012-10-17",  "Statement": [
    {
      "Sid": "PermissionToInvoke",
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:LAMBDA_FUNCTION_NAME"
    }
  ]
}

要使用 Lambda 控制台列出 Lambda 函数,请向 IAM 策略添加以下权限:

{  "Sid": "PermissionsToViewFunctionsConfigInConsole",
  "Effect": "Allow",
  "Action": [
    "lambda:ListFunctions",
    "lambda:GetAccountSettings",
    "lambda:GetFunction",
    "lambda:ListTags"
  ],
  "Resource": "*"
}

要允许其他服务调用 Lambda 函数,请对 Lambda 使用基于资源的策略。还可以使用函数策略提供对 Lambda 函数的跨账户访问权限。

以下示例策略允许来自不同账户的用户手动调用 Lambda 函数:

{  "Version": "2012-10-17",  "Id": "default",
  "Statement": [
    {
      "Sid": "PermissionToInvoke",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::External_AWS_ACCOUNT_ID:user/IAM_USER_NAME"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:AWS_REGION:AWS_ACCOUNT_ID:function:LAMBDA_FUNCTION_NAME"
    }
  ]
}

**注意:**请将 External_AWS_ACCOUNT_ID 替换为您要允许调用该函数的账户。

监控 Lambda 函数所需的权限

要在 Lambda 控制台的 Monitoring(监控)选项卡中查看 Amazon CloudWatch 指标,请向 IAM 策略添加以下权限:

{  "Version": "2012-10-17",  "Statement": [
    {
      "Sid": "PermissionForCloudWatchMetrics",
       "Effect": "Allow",
       "Action": [
          "cloudwatch:GetMetricStatistics",
          "cloudwatch:GetMetricData"
        ],
        "Resource": "*"
     }
  ]
}

要授予特定 CloudWatch 指标和 CloudWatch Logs Insights 权限,请参阅 Amazon CloudWatch 权限参考CloudWatch Logs 权限参考