【问题标题】:Outputting Athena Query Result to s3 bucket in a different AWS Account from Lambda将 Athena 查询结果输出到来自 Lambda 的不同 AWS 账户中的 s3 存储桶
【发布时间】:2020-03-05 22:25:02
【问题描述】:

我正在尝试设置 lambda 以每天运行 AWS Athena 查询并将结果输出到存储在不同 AWS 账户中的 s3 存储桶。我正在编写 Lambda 的帐户在另一个帐户中具有 s3 写入权限,我只是不知道如何输入我要写入的特定存储桶,而且我找不到任何文档这个用例。

以下是我从 lambda 运行我的雅典娜查询的方式:

client = boto3.client('athena')
client.start_query_execution(
        QueryString = [QUERY],
        QueryExecutionContext={
            'Database': [DATABASE]
        },
        ResultConfiguration={
            'OutputLocation': [OUTPUT_LOCATION]
        }
    )

将结果存储在我自己的 AWS 账户中时,我的查询工作正常。我不能只写“s3://[BUCKETNAME]”,其中存储桶名称是另一个帐户中存储桶的名称。

我猜我缺少一些非常简单的东西——如果有人能告诉我如何格式化“OUTPUT_LOCATION”,其中 ACCOUNT_ID 是另一个帐户的 ID,而 BUCKET_NAME 是存储桶的名称,那就是很有帮助!

【问题讨论】:

  • 你试过在桶名后面加斜杠吗? s3://BUCKETNAME/你收到什么错误?
  • 你找到答案了吗??
  • S3 Bucket 和 Athena 数据库应该在同一个区域。参考:stackoverflow.com/questions/45313763/…

标签: amazon-web-services amazon-s3 aws-lambda amazon-athena


【解决方案1】:

存储桶名称在分区内必须是唯一的。分区是一组区域。 AWS 目前有三个分区:aws(标准区域)、aws-cn(中国区域)和 aws-us-gov(AWS GovCloud [美国] 区域)。

参考这个doc on the naming standards

在定义 S3 存储桶的名称时,您不必指定账户 ID。

例如,s3 存储桶的 ARN 将没有账户 ID

arn:aws:s3:::<BUCKET_NAME>

而资源或角色的 ARN 将具有其帐户 ID

arn:aws:iam::<MyAccountA>:role/<MyRoleA>

client = boto3.client('athena')
client.start_query_execution(
        QueryString = [QUERY],
        QueryExecutionContext={
            'Database': [DATABASE]
        },
        ResultConfiguration={
            'OutputLocation': 's3://<BUCKET_NAME>`' # Even when the bucket is another AWS account
        }
    )

如果查询失败,请开始查看权限。你的代码是对的。

【讨论】:

  • 第一个答案很好!
猜你喜欢
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 2021-03-28
  • 2020-03-29
  • 2019-06-28
  • 2019-01-15
  • 2016-08-09
相关资源
最近更新 更多