2016-01-15 35 views
2

我有一个节点应用程序,用于侦听RabbitMQ队列上的消息,并为它接收到的每个消息启动一个新的独立节点进程,以处理消息的内容。使用API​​调用获取我的AWS凭证

第二个按需启动的节点应用程序与S3进行了一些工作,从盒子的IAM角色获取凭证。

事实证明,我似乎被Node AWS SDK通过EC2元数据服务检索IAM角色时遇到了一个错误。基本上,在负载下,对元数据服务的http调用超时(https://github.com/aws/aws-sdk-js/issues/692)。

因此,作为一种变通方法,我想知道,如果父节点处理可以使用一些API调用或其他弄虚作假方式校验AWS证书,并通过他们在命令行的子节点的应用程序吗?

这意味着父应用程序只需调用一次元数据服务,从而减轻了它的负担。

可能以任何方式?

回答

2

让主节点应用程序从元数据服务中检索凭据,在内存中本地缓存它们,在调用子进程时根据需要传递它们,并让主节点应用程序在其到期之前刷新缓存的凭据。

您可以直接从元数据服务中检索访问密钥ID,秘密访问密钥,会话令牌和过期时间。例如:curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role-xyz会产生:

{ 
    "Code" : "Success", 
    "LastUpdated" : "2016-01-15T16:20:09Z", 
    "Type" : "AWS-HMAC", 
    "AccessKeyId" : "xxx", 
    "SecretAccessKey" : "xxx", 
    "Token" : "xxx", 
    "Expiration" : "2016-01-15T23:00:11Z" 
} 
+0

是的,那就是我在想的那种东西。由于子进程可能会长时间运行,如果在2016-01-15T23:00:11Z之后继续使S3分段上传http调用会发生什么情况 - 在答案中使用JSON? –

+1

@MikeHogan如果上传者客户端使用过期凭证进行任何API调用,那么该API调用将被ExpiredToken拒绝。我认为您需要确保您的上传在临时凭证过期之前完成,或者获取新的临时凭证以用于在原始集过期后进行的所有API调用。我认为这应该起作用,但还没有真正进行过测试。如果您在EC2实例上使用IAM角色,那么我期望在SDK的封面下结合EC2元数据服务为您处理这个问题,但是再次没有对此进行测试。 – jarmod

+0

IP地址169.254.169.254从哪里来? – LRK9