能否在本账号Amazon Athena中创建库表访问其他账号S3数据?
跨账号通过Athena访问S3数据的可行方案
当然可以实现!你之前的推测里关于跨账号授权的部分是正确的,但「Athena与S3存储桶必须处于同一账号」这个点是误解——AWS完全支持在自己账号的Athena中创建库表,来访问另一账号下的S3数据,只要配置好相应的权限策略就行。下面是具体的操作步骤:
1. 配置目标S3桶的跨账号访问策略
首先需要在存储数据的另一账号的S3桶上,添加桶策略,允许你的Athena所在账号的IAM实体(比如Athena执行角色)访问该桶及其中的对象。示例桶策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的账号ID:role/你的Athena执行角色名" }, "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::目标账号的桶名", "arn:aws:s3:::目标账号的桶名/*" ] } ] }
这里要替换掉你的账号ID、你的Athena执行角色名和目标账号的桶名为实际信息。
2. 确保你的Athena执行角色有足够权限
在你自己的账号中,给Athena的执行角色添加权限,允许它访问目标S3桶,以及存储Athena查询结果的S3位置(这个是Athena运行的必要条件)。示例IAM权限片段:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::目标账号的桶名", "arn:aws:s3:::目标账号的桶名/*" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": "arn:aws:s3:::你的Athena查询结果桶/*" } ] }
3. 在你的Athena中创建库表
完成权限配置后,就可以在自己账号的Athena控制台中创建数据库和表了,关键是在建表语句的LOCATION字段中指定另一账号的S3路径。示例建表语句:
CREATE EXTERNAL TABLE IF NOT EXISTS my_cross_account_table ( id INT, name STRING, timestamp TIMESTAMP ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = ',' ) LOCATION 's3://目标账号的桶名/数据文件路径/';
额外注意事项
- 如果目标S3桶和你的Athena处于不同AWS区域,需要注意跨区域访问的性能和成本,但功能上是完全支持的。
- 如果S3桶中的对象有单独的ACL权限,还需要确保这些对象的权限也允许你的Athena执行角色访问,或者在桶策略中明确覆盖对象级的权限限制。
内容的提问来源于stack exchange,提问作者Punter Vicky
相关产品推荐
相关产品推荐

