2016-10-02 58 views
1

我正在尝试使用AWS SDK(Java)为其创建SNS平台应用程序并为其启用传递状态功能。作为第一步,我创建了必要的角色“SNSSuccessFeedback”和“SNSFailureFeedback”。示例代码(Groovy中):无法创建具有传递状态属性的SNS平台应用程序

AmazonIdentityManagementClient aimClient = getAimClient(/*credentials*/) 

// create "SNSSuccessFeedback" role: 
aimClient.createRole(new CreateRoleRequest().withRoleName("SNSSuccessFeedback") 
     .withAssumeRolePolicyDocument('{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"sts:AssumeRole"}]}')) 
aimClient.putRolePolicy(new PutRolePolicyRequest().withRoleName("SNSSuccessFeedback") 
     .withPolicyName("oneClick_SNSSuccessFeedback_1234567890") 
     .withPolicyDocument('{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents","logs:PutMetricFilter","logs:PutRetentionPolicy"],"Resource":["*"]}]}')) 
// the same code for "SNSFailureFeedback" role 

// get ARN for both "SNSSuccessFeedback" and "SNSFailureFeedback" 

// create platform application: 
AmazonSNSClient snsClient = getSnsClient(/*credentials*/) 
snsClient.createPlatformApplication(new CreatePlatformApplicationRequest() 
     .withName("myapp") 
     .withPlatform("APNS") 
     .withAttributes([PlatformPrincipal: "certificate", PlatformCredential: "key", 
       SuccessFeedbackRoleArn: successRoleArn, FailureFeedbackRoleArn: failureRoleArn, 
       SuccessFeedbackSampleRate: "100"])) 

但出于某种原因,我得到错误:

无效参数:属性原因:FailureFeedbackRoleArn:属性的值无效阿尔恩:AWS:IAM :: 1234567890:角色/ SNSFailureFeedback (服务:AmazonSNS;状态码:400;错误代码:InvalidParameter;请求ID:c1dbd591-f044-584a-bbac-85fa9a0cbe8d)

如果我只是添加延迟(例如Thread.sleep(5000))创建角色之后,创建平台应用程序之前,平台应用程序将成功创建w没有错误。

那么,在启用交付状态的情况下创建角色和平台应用程序的正确方法是什么?

回答

2

创建角色时,您正在经历最终的一致性。时间延迟允许角色对下一个API请求“可见”。您可以枚举IAM角色以查看您需要的角色是否“可见”,而不是任意时间延迟。

+0

如果角色不可见,该怎么办? –

+0

最好放入一个检查来查看该角色是否在'listRoles()'请求中返回。如果角色没有返回,请稍等一下再检查一次。这样你就可以保证当'createPlatformApplication()'调用时角色是可用的。 – jbird

+1

由于listRoles()通过暴露的API直接与IAM通信,而另一个请求正在与另一个正在通话的服务通话,所以实际上可能需要比'listRoles()'返回它多一点时间到可能不同(AWS /内部)接口的IAM,其中可能存在额外的传播延迟。潜在有用:[在AWS IAM策略有效之前应该等待多久?](http://stackoverflow.com/q/20156043/1695906)该问题涉及用户策略+ S3而不是角色+ SNS,但答案应该同样适用。 +1 –

相关问题