我有一个使用来自 aws 的多种服务的 python 应用程序。我为每个服务都有一个访问密钥和密码。对于大多数服务,我使用boto,不需要环境中的AWS_ACCESS_KEY_ID或AWS_SECRET_ACCESS_KEY。对于dynamoDB,我使用pynamoDB,我不知道如何在没有这些变量的情况下设置凭据。
我想在设置文件中标准化凭据,以避免凭据冲突等错误。
这可能吗?如果是这样,它是如何完成的?
来自 PynamoDB 文档:
PynamoDB 使用 botocore 与 DynamoDB API 进行交互。因此,任何 botocore支持的配置方法与PynamoDB配合使用。为 本地开发使用环境变量,例如 AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY可能更可取。 当然,您可以按照 AWS 的建议使用 IAM 用户。另外 EC2 角色也可以工作,建议在运行时使用 EC2.
请注意,如果您要与之交互的所有服务都位于同一 AWS 账户中,则提供凭证的首选方法是创建附加了所有必要权限的单个 IAM 账户,或者创建 IAM 角色(如果代码在 EC2 或 Lambda 上运行)。
我在网上搜索这个并遇到了这个问题,虽然这很旧,但我正在分享我的解决方案,以便它可能对某人有所帮助。
定义 Dynamo DB 模型时,我们只需要添加一行包含 IAM 角色名称的附加代码。下面是一个示例模型。
如果您像下面这样更改模型,我们不需要容器上的~/.aws/credentials
文件。
注意:请确保将 DynamoDBRead 或写入策略附加到 IAM 角色,我已经为我的实例 IAM 角色附加了AmazonDynamoDBFullAccess
策略。
from pynamodb.models import Model
from pynamodb.attributes import (
UnicodeAttribute, NumberAttribute, UnicodeSetAttribute, UTCDateTimeAttribute
)
import urllib2
class TestClass(Model):
email = UnicodeAttribute(hash_key=True)
UUID = UnicodeAttribute(range_key=True)
class Meta:
region = 'eu-west-2'
# Refer: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html
instanceProfileName = urllib2.urlopen(
'http://169.254.169.254/latest/meta-data/iam/security-credentials/').read()
table_name = 'dynamodb-tablename'