如何在PynamoDB中使用代码中的访问凭证而不是环境变量

时间:2016-07-18 15:08:44

标签: python amazon-web-services amazon-dynamodb

我有一个python应用程序,它使用来自aws的多个服务。我有一个访问密钥和每个服务的秘密。对于我使用boto而且在环境中不需要AWS_ACCESS_KEY_ID或AWS_SECRET_ACCESS_KEY的大多数服务。对于dynamoDB我使用pynamoDB,我不知道如何在没有这些变量的情况下设置凭证。

我想在设置文件中标准化凭据,以避免像凭据冲突这样的错误。

这可能吗?如果是这样,它是如何完成的?

2 个答案:

答案 0 :(得分:2)

来自the PynamoDB documentation

  

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'