S3 存储桶策略限制对单个文件夹的访问
S3 Bucket Policy Restricting Access to Single Folder
我有一个被多个 Lambda 访问的 S3 存储桶。我想限制对单个文件夹的访问,以便只有一个 Lambda 可以访问它。
我有以下创建所有资源的 Cloud Formation 模板,但我无法获得正确的存储桶策略条件。当我的 Lambda 执行角色被指定为例外时,它会限制对文件夹的访问,但不会授予对我的 Lambda 的访问权限。为什么下面的模板不起作用?
ExampleBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub '${AWS::StackName}-${AWS::AccountId}-example-bucket'
ExampleBucketPolicy:
Type: 'AWS::S3::BucketPolicy'
Properties:
Bucket: !Ref ExampleBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Action:
- 's3:*'
Effect: Deny
Resource:
- !Sub arn:aws:s3:::${ExampleBucket}/example-folder/
- !Sub arn:aws:s3:::${ExampleBucket}/example-folder/*
Principal: '*'
Condition:
ArnNotEquals:
aws:SourceArn:
- !GetAtt LambdaExecutionRole.Arn
LambdaFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Sub ${AWS::StackName}-handler
CodeUri: ./src
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Runtime: nodejs12.x
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action:
- sts:AssumeRole
Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess
Policies:
- PolicyName: !Sub ${AWS::StackName}
PolicyDocument:
Statement:
- Action:
- s3:GetObject
- s3:ListBucket
- s3:PutObject
Effect: Allow
Resource:
- !Sub arn:aws:s3:::${ExampleBucket}
- !Sub arn:aws:s3:::${ExampleBucket}/*
- Action:
- lambda:InvokeFunction
Effect: Allow
Resource: '*'
我收到以下错误:“StoreDB 函数错误:putStoreObject,访问密钥:example-folder/example-file,AWS S3 消息:拒绝访问”
根据 OP 的评论,从 aws:SourceArn
更改为 aws:PrincipalArn
有效。
我有一个被多个 Lambda 访问的 S3 存储桶。我想限制对单个文件夹的访问,以便只有一个 Lambda 可以访问它。
我有以下创建所有资源的 Cloud Formation 模板,但我无法获得正确的存储桶策略条件。当我的 Lambda 执行角色被指定为例外时,它会限制对文件夹的访问,但不会授予对我的 Lambda 的访问权限。为什么下面的模板不起作用?
ExampleBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub '${AWS::StackName}-${AWS::AccountId}-example-bucket'
ExampleBucketPolicy:
Type: 'AWS::S3::BucketPolicy'
Properties:
Bucket: !Ref ExampleBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Action:
- 's3:*'
Effect: Deny
Resource:
- !Sub arn:aws:s3:::${ExampleBucket}/example-folder/
- !Sub arn:aws:s3:::${ExampleBucket}/example-folder/*
Principal: '*'
Condition:
ArnNotEquals:
aws:SourceArn:
- !GetAtt LambdaExecutionRole.Arn
LambdaFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Sub ${AWS::StackName}-handler
CodeUri: ./src
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Runtime: nodejs12.x
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action:
- sts:AssumeRole
Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess
Policies:
- PolicyName: !Sub ${AWS::StackName}
PolicyDocument:
Statement:
- Action:
- s3:GetObject
- s3:ListBucket
- s3:PutObject
Effect: Allow
Resource:
- !Sub arn:aws:s3:::${ExampleBucket}
- !Sub arn:aws:s3:::${ExampleBucket}/*
- Action:
- lambda:InvokeFunction
Effect: Allow
Resource: '*'
我收到以下错误:“StoreDB 函数错误:putStoreObject,访问密钥:example-folder/example-file,AWS S3 消息:拒绝访问”
根据 OP 的评论,从 aws:SourceArn
更改为 aws:PrincipalArn
有效。