Lambda - 如何创建客户托管策略?

Lambda - How to create customer managed policy?

背景:

可以通过两种方式创建 IAM 策略:


以下 SAM 模板正在创建内联策略:

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: hello-world/
      Handler: app.LambdaHandler
      Runtime: nodejs8.10
      Policies:
      - Statement:
        - Sid: AccessToS3Policy
          Effect: Allow
          Action:
          - s3:GetObject
          - s3:GetObjectACL
          Resource: 'arn:aws:s3:::some-bucket/*'

在生成的角色中,如下图:

{
   "roleName": "somestack-HelloWorldFunctionRole-AAAAAAAA",
   "policies": [
   {
      "document": {
        "Statement": [
          {
            "Action": [
              "s3:GetObject",
              "s3:GetObjectACL"
            ],
            "Resource": "arn:aws:s3:::some-bucket/*",
            "Effect": "Allow",
            "Sid": "AccessToS3Policy"
          }
        ]
      },
      "name": "HelloWorldFunctionRolePolicy0",
      "type": "inline"
    },
    .....
   ]
 }

对于 Lambda 函数,

1) 如何创建客户托管策略?

2) 内联策略与客户管理的策略有何不同?

如果您在 SAM 模板中使用此语法

Policies:
      - Statement:
        - Sid: AccessToS3Policy
          Effect: Allow
          Action:
          - s3:GetObject
          - s3:GetObjectACL
          Resource: 'arn:aws:s3:::some-bucket/*'

它将自动创建内联策略。如果您想创建客户管理的策略而不是内联策略,那么您需要在模板中将策略定义为单独的 Resource 并在 policies 中引用它。或者您可以在模板外部创建角色(例如通过 AWS 控制台)并引用该策略,就像您引用 AWS 托管策略一样。

内联策略与客户管理的策略有何不同?

我真的不会说内联策略是旧的做事方式。内联策略和客户托管策略之间的唯一区别是内联策略不能重复使用(您不能将内联策略分配给两个或多个实体)。但是,如果您需要一个您不打算在未来重复使用的特定策略,这通常会很方便。