我有一个python应用程序,它使用来自aws的多个服务。我有一个访问密钥和每个服务的秘密。对于我使用boto而且在环境中不需要AWS_ACCESS_KEY_ID或AWS_SECRET_ACCESS_KEY的大多数服务。对于dynamoDB我使用pynamoDB,我不知道如何在没有这些变量的情况下设置凭证。
我想在设置文件中标准化凭据,以避免像凭据冲突这样的错误。
这可能吗?如果是这样,它是如何完成的?
答案 0 :(得分:2)
PynamoDB使用botocore与DynamoDB API进行交互。因此,任何 botocore支持的配置方法与PynamoDB一起使用。对于 本地开发使用环境变量等 AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY可能更可取。 您当然可以按照AWS的建议使用IAM用户。此外 EC2角色也可以运行,并且在运行时会被推荐 EC2。
请注意,如果您要与之交互的所有服务都在同一AWS账户中,那么提供凭据的首选方式是创建一个附加了所有必要权限的单个IAM帐户,或者如果代码是IAM,则创建一个IAM角色。在EC2或Lambda上运行。
答案 1 :(得分:0)
我在网上搜索并遇到了这个问题,虽然这已经过时了,但我正在分享我的解决方案,以便对某人有所帮助。
定义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'