【问题标题】:Download Files From AWS S3 Without Access and Secret Keys in Python从 AWS S3 下载文件,无需 Python 中的访问和密钥
【发布时间】:2020-02-19 22:16:08
【问题描述】:

我有一个工作代码可以从 S3 中的一个存储桶下载文件,并在 Python 中完成一些转换工作。我没有在代码中嵌入访问密钥和密钥,但密钥在我的 AWS CLI 配置中。

import boto3
import botocore


BUCKET_NAME = 'converted-parquet-bucket' # replace with your own bucket name
KEY = 'json-to-parquet/names.snappy.parquet' # replace with path and follow with key object

s3 = boto3.resource('s3')

try:
    s3.Bucket(BUCKET_NAME).download_file(KEY, 'names.snappy.parquet') #  replace the key object name
except botocore.exceptions.ClientError as e: # exception handling
    if e.response['Error']['Code'] == "404":
        print("The object does not exist.") # if object that you are looking for does not exist it will print this
    else:
        raise

# Un comment lines 21 and 22 to convert csv to parquet
# dataframe = pandas.read_csv('names.csv')
# dataframe.to_parquet('names.snappy.parquet' ,engine='auto', compression='snappy')

data = pq.read_pandas('names.snappy.parquet', columns=['Year of Birth', 'Gender', 'Ethnicity', "Child's First Name", 'Count', 'Rank']).to_pandas()


#print(data) # this code will print the ALL the data in the parquet file

print(data.loc[data['Gender'] == 'MALE']) # this code will print the data in the parquet file ONLY what is in the query (SQL query)

有人可以帮助我如何在在代码中嵌入访问和密钥在 AWS 配置中

的情况下让此代码正常工作

【问题讨论】:

  • 您可以只使用配置文件,从那里导入密钥,然后以这种方式访问​​它们。
  • @crookedleaf 我根本不想使用访问密钥和密钥,这就是问题的目的
  • 啊...我以为您只是不想将它们嵌入到您的代码中。在那种情况下,我认为您无能为力。如果存储桶中的文件是私有且受保护的,那么据我所知,您必须提供这些密钥才能访问它们。类似于尝试使用用户名和密码访问网站但不想提供用户名和密码
  • @crookedleaf 是的,这就是我想要做的,我知道这个问题的开头答案可能是否定的,但我还是试了一下,看看它是否不可能或有任何解决方法
  • 您打算在哪里运行此代码?您的笔记本电脑、EC2、Lambda 还是其他地方?而且我认为 S3 对象(文件本身)不是公开可读的。

标签: python amazon-web-services amazon-s3 aws-sdk


【解决方案1】:

如果您在本地运行函数,则需要在本地凭证/配置文件中包含您的凭证才能与 AWS 资源交互。

另一种方法是在 AWS Lambda 上运行(如果您的函数定期运行,您可以使用 CloudWatch Events 进行设置)并使用 Environment VariablesAWS Security Token Service (STS) 生成临时凭证。

【讨论】:

  • 目前在我的本地使用 AWS CLI 并在那里存储密钥,但我想要做的是根本不使用 AWS CLI,我不想对密钥进行硬编码。我知道这听起来很奇怪,但这就是我的客户要求我做的事情
【解决方案2】:

如果您不想使用密钥/访问密钥,则应使用 rolespolicies。这是交易:

定义一个角色(例如RoleWithAccess)并确保您的用户(在您的凭据中定义)可以担任该角色

RoleWithAccess 设置策略,授予对您的存储桶的读/写访问权限

如果您在本地机器上执行它,请运行必要的命令 (AWS CLI) 来创建一个 配置文件,让您假设 RoleWithAccess(例如ProfileWithAccess

使用 session 执行你的脚本,传递这个 profile 作为参数,这意味着你需要替换:

s3 = boto3.resource('s3')

session = boto3.session.Session(profile_name='ProfileWithAccess')
s3 = session.resource('s3')

这种方法的好处是,如果您在 EC2 实例中运行它,您可以在构建实例时将其绑定到特定角色(例如RoleWithAccess)。在这种情况下,您可以完全忽略会话、配置文件、所有 AWS CLIhocus pocus,然后运行 ​​s3 = boto3.resource('s3')

您还可以使用 AWS Lambda,设置 rolepolicy 对您的存储桶具有读/写权限。

【讨论】:

  • 它仍然对我不起作用,因为根据您的建议,CLI 仍然是必需的,就我而言,我的客户不想安装 CLI 或硬编码访问和密钥。
  • 如果您在 EC2 实例或 Lambda 中运行代码,则不需要 CLI 或密钥,只需设置您的角色和策略。
猜你喜欢
  • 2019-04-22
  • 1970-01-01
  • 2018-01-31
  • 2021-12-18
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多