Boto:从配置中动态获取 Python 代码中的 aws_access_key_id 和 aws_secret_access_key?
Boto: Dynamically get aws_access_key_id and aws_secret_access_key in Python code from config?
我的 aws_access_key_id
和 aws_secret_access_key
存储在 ~/.boto
中,想知道是否有办法使用 Boto 在我的 python 代码中检索这些值因为我需要将它们插入到我的 SQL 语句中以从 S3 复制 CSV 文件。
这应该有效:
import boto
access_key = boto.config.get_value('Credentials', 'aws_access_key_id')
secret_key = boto.config.get_value('Credentials', 'aws_secret_access_key')
如果 boto.config
不起作用,这里有一个助手会在 ~/.aws/credentials
中查找。我没有仔细研究它,但似乎 Boto 2 没有在 ~/.aws/credentials
.
中查找
def get_aws_credentials():
# I think this will look in ~/.boto ([Credentials] section)
aws_access_key_id = boto.config.get_value("Credentials", 'aws_access_key_id')
aws_secret_access_key = boto.config.get_value("Credentials", 'aws_secret_access_key')
# I don't think Boto 2 looks in ~/.aws/credentials, so we look
if aws_access_key_id is None or aws_secret_access_key is None:
with open(os.path.expanduser("~/.aws/credentials")) as f:
for line in f:
try:
key, val = line.strip().split('=')
if key == 'aws_access_key_id':
aws_access_key_id = val
elif key == 'aws_secret_access_key':
aws_secret_access_key = val
except ValueError:
pass
return aws_access_key_id, aws_secret_access_key
因为 aws 凭证和 boto 文件都使用 .ini
格式,您可以使用 ConfigParser
解析它们。这是解析 ~/.aws/credentials
文件的示例(这是 python 2,但应该很容易移植到 python 3):
from os.path import expanduser
import ConfigParser
def read_credentials_from_config_section(section_name):
# parsing ~/.aws/credentials but it's just as easy to parse ~/.boto
aws_credentials_path = os.path.join(expanduser("~"), '.aws', 'credentials')
c = ConfigParser.ConfigParser()
c.read(aws_credentials_path)
return c.get(section_name, 'aws_access_key_id'), c.get(section_name, 'aws_secret_access_key')
使用方式:
k, s = read_credentials_from_config_section('default')
如果要使用~/.boto
文件,修改上面的代码读取~/.boto
文件,并调整其命名约定——代码非常相似。
另一种读取 ~/.aws/credentials
文件的方法(假设您安装了 awscli
)是 shell 到 aws cli 并让它处理细节。不过,这要慢得多(在我的机器上 运行 需要大约 1.5 秒,这对于很多用例来说是不可接受的)。
import subprocess
print subprocess.check_output(['aws', 'configure', 'get', 'aws_access_key_id', '--profile', aws_profile_name])
print subprocess.check_output(['aws', 'configure', 'get', 'aws_secret_access_key', '--profile', aws_profile_name])
我的 aws_access_key_id
和 aws_secret_access_key
存储在 ~/.boto
中,想知道是否有办法使用 Boto 在我的 python 代码中检索这些值因为我需要将它们插入到我的 SQL 语句中以从 S3 复制 CSV 文件。
这应该有效:
import boto
access_key = boto.config.get_value('Credentials', 'aws_access_key_id')
secret_key = boto.config.get_value('Credentials', 'aws_secret_access_key')
如果 boto.config
不起作用,这里有一个助手会在 ~/.aws/credentials
中查找。我没有仔细研究它,但似乎 Boto 2 没有在 ~/.aws/credentials
.
def get_aws_credentials():
# I think this will look in ~/.boto ([Credentials] section)
aws_access_key_id = boto.config.get_value("Credentials", 'aws_access_key_id')
aws_secret_access_key = boto.config.get_value("Credentials", 'aws_secret_access_key')
# I don't think Boto 2 looks in ~/.aws/credentials, so we look
if aws_access_key_id is None or aws_secret_access_key is None:
with open(os.path.expanduser("~/.aws/credentials")) as f:
for line in f:
try:
key, val = line.strip().split('=')
if key == 'aws_access_key_id':
aws_access_key_id = val
elif key == 'aws_secret_access_key':
aws_secret_access_key = val
except ValueError:
pass
return aws_access_key_id, aws_secret_access_key
因为 aws 凭证和 boto 文件都使用 .ini
格式,您可以使用 ConfigParser
解析它们。这是解析 ~/.aws/credentials
文件的示例(这是 python 2,但应该很容易移植到 python 3):
from os.path import expanduser
import ConfigParser
def read_credentials_from_config_section(section_name):
# parsing ~/.aws/credentials but it's just as easy to parse ~/.boto
aws_credentials_path = os.path.join(expanduser("~"), '.aws', 'credentials')
c = ConfigParser.ConfigParser()
c.read(aws_credentials_path)
return c.get(section_name, 'aws_access_key_id'), c.get(section_name, 'aws_secret_access_key')
使用方式:
k, s = read_credentials_from_config_section('default')
如果要使用~/.boto
文件,修改上面的代码读取~/.boto
文件,并调整其命名约定——代码非常相似。
另一种读取 ~/.aws/credentials
文件的方法(假设您安装了 awscli
)是 shell 到 aws cli 并让它处理细节。不过,这要慢得多(在我的机器上 运行 需要大约 1.5 秒,这对于很多用例来说是不可接受的)。
import subprocess
print subprocess.check_output(['aws', 'configure', 'get', 'aws_access_key_id', '--profile', aws_profile_name])
print subprocess.check_output(['aws', 'configure', 'get', 'aws_secret_access_key', '--profile', aws_profile_name])