无法在 SAM 模板资源(无服务器功能)中获取策略定义的语法
Could not get the syntax of policy definition in SAM template resource(serverless function)
AWS 托管策略(AWSLambdaExecute
) 的策略定义是:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "logs:*" ],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [ "s3:GetObject", "s3:PutObject" ],
"Resource": "arn:aws:s3:::*"
}
]
}
但是 AWS_documentation 使用相同的策略名称 AWSLambdaExecute
给出了一个示例无服务器函数,如下所示:
Type: AWS::Serverless::Function
Properties:
Handler: index.js
Runtime: nodejs8.10
CodeUri: 's3://my-code-bucket/my-function.zip'
Description: Creates thumbnails of uploaded images
MemorySize: 1024
Timeout: 15
Policies:
- AWSLambdaExecute # Managed Policy
- Version: '2012-10-17' # Policy Document
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:GetObjectACL
Resource: 'arn:aws:s3:::my-bucket/*'
与上述定义不符。
编辑:
下面是示例函数的执行角色...我没有看到 AWS 管理的执行角色名称(例如 AWSLambdaBasicExecutionRole
)。因为我的理解是,AWSLambdaBasicExecutionRole
角色应该分配给Lambda,默认
我们是否在此示例中覆盖了 AWSLambdaExecute
的策略定义?
当您指定策略时,您基本上是在为您的 lambda 函数构建一个执行角色。
Policies
是一个策略列表,因为角色可以包含多个策略。
这一行
- AWSLambdaExecute # Managed Policy
声明您正在创建的 lambda 函数应包含此 AWS 托管策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "logs:*" ],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [ "s3:GetObject", "s3:PutObject" ],
"Resource": "arn:aws:s3:::*"
}
]
}
以下几行:
- Version: '2012-10-17' # Policy Document
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:GetObjectACL
Resource: 'arn:aws:s3:::my-bucket/*'
正在指定您要包含在您的 lambda 执行角色中的下一个策略。
我们是否在此示例中覆盖了 AWSLambdaExecute 的策略定义?
不,我们正在向 lambda 执行角色添加多个策略,其中之一是 AWS 托管策略,一个是我们自己的自定义策略。因此 lambda 函数将具有在它们中定义的权限。或者更准确地说,将制定这些政策的联合,并且 lambda 函数将具有该联合定义的权限,这意味着如果其中一个政策允许 lambda 函数做某事而另一个拒绝同样的事情,结果将是该操作将被拒绝。
我认为您的 Policies 属性的作用是:
- 附加托管策略 AWSLambdaExecute 然后
- 为您的执行角色创建一个内联策略,该策略授予 s3 权限 s3:GetObject 和 s3:PutObject。还有另一个 SO post 表示 SAM 现在支持定义内联策略。 [1]
定义内联策略不会覆盖任何内容。
您可以将多种不同类型的策略附加到单个身份(例如 IAM 用户或角色)。 [2]
参考资料
[1]
[2] https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html
这是我的首选方法(为清楚起见省略其他字段):
MyLambdaFunction:
Type: 'AWS::Serverless::Function'
Properties:
Policies:
- CloudWatchLambdaInsightsExecutionRolePolicy # AWS Managed Policy
- AWSXrayWriteOnlyAccess # AWS Managed Policy
- AWSLambdaExecute # AWS Managed Policy
- Version: '2012-10-17' # Policy Document to allow S3 access
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:GetObjectACL
Resource: 'arn:aws:s3:::my-bucket/*'
AWS 托管策略(AWSLambdaExecute
) 的策略定义是:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "logs:*" ],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [ "s3:GetObject", "s3:PutObject" ],
"Resource": "arn:aws:s3:::*"
}
]
}
但是 AWS_documentation 使用相同的策略名称 AWSLambdaExecute
给出了一个示例无服务器函数,如下所示:
Type: AWS::Serverless::Function
Properties:
Handler: index.js
Runtime: nodejs8.10
CodeUri: 's3://my-code-bucket/my-function.zip'
Description: Creates thumbnails of uploaded images
MemorySize: 1024
Timeout: 15
Policies:
- AWSLambdaExecute # Managed Policy
- Version: '2012-10-17' # Policy Document
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:GetObjectACL
Resource: 'arn:aws:s3:::my-bucket/*'
与上述定义不符。
编辑:
下面是示例函数的执行角色...我没有看到 AWS 管理的执行角色名称(例如 AWSLambdaBasicExecutionRole
)。因为我的理解是,AWSLambdaBasicExecutionRole
角色应该分配给Lambda,默认
我们是否在此示例中覆盖了 AWSLambdaExecute
的策略定义?
当您指定策略时,您基本上是在为您的 lambda 函数构建一个执行角色。
Policies
是一个策略列表,因为角色可以包含多个策略。
这一行
- AWSLambdaExecute # Managed Policy
声明您正在创建的 lambda 函数应包含此 AWS 托管策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "logs:*" ],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [ "s3:GetObject", "s3:PutObject" ],
"Resource": "arn:aws:s3:::*"
}
]
}
以下几行:
- Version: '2012-10-17' # Policy Document
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:GetObjectACL
Resource: 'arn:aws:s3:::my-bucket/*'
正在指定您要包含在您的 lambda 执行角色中的下一个策略。
我们是否在此示例中覆盖了 AWSLambdaExecute 的策略定义?
不,我们正在向 lambda 执行角色添加多个策略,其中之一是 AWS 托管策略,一个是我们自己的自定义策略。因此 lambda 函数将具有在它们中定义的权限。或者更准确地说,将制定这些政策的联合,并且 lambda 函数将具有该联合定义的权限,这意味着如果其中一个政策允许 lambda 函数做某事而另一个拒绝同样的事情,结果将是该操作将被拒绝。
我认为您的 Policies 属性的作用是:
- 附加托管策略 AWSLambdaExecute 然后
- 为您的执行角色创建一个内联策略,该策略授予 s3 权限 s3:GetObject 和 s3:PutObject。还有另一个 SO post 表示 SAM 现在支持定义内联策略。 [1]
定义内联策略不会覆盖任何内容。 您可以将多种不同类型的策略附加到单个身份(例如 IAM 用户或角色)。 [2]
参考资料
[1]
[2] https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html
这是我的首选方法(为清楚起见省略其他字段):
MyLambdaFunction:
Type: 'AWS::Serverless::Function'
Properties:
Policies:
- CloudWatchLambdaInsightsExecutionRolePolicy # AWS Managed Policy
- AWSXrayWriteOnlyAccess # AWS Managed Policy
- AWSLambdaExecute # AWS Managed Policy
- Version: '2012-10-17' # Policy Document to allow S3 access
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:GetObjectACL
Resource: 'arn:aws:s3:::my-bucket/*'