【问题标题】:Unable to create SNS platform application with delivery status attributes无法创建具有传递状态属性的 SNS 平台应用程序
【发布时间】:2017-02-10 19:09:48
【问题描述】:

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

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:arn:aws:iam::1234567890:role/SNSFailureFeedback 不是允许 SNS 写入 Cloudwatch 日志的有效角色(服务:AmazonSNS;状态代码:400 ; 错误代码: InvalidParameter; 请求ID: c1dbd591-f044-584a-bbac-85fa9a0cbe8d)

如果我只是在角色创建之后和平台应用程序创建之前添加延迟(例如Thread.sleep(5000)),那么平台应用程序将成功创建而不会出错。

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

【问题讨论】:

    标签: java amazon-web-services aws-sdk amazon-sns


    【解决方案1】:

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

    【讨论】:

    • 角色不“可见”怎么办?
    • 最好检查一下listRoles() 请求中是否返回了该角色。如果没有返回角色,请稍等片刻,然后再次检查。这样您就可以保证在调用createPlatformApplication() 时该角色可用。
    • 它实际上可能需要比listRoles() 返回它所需的时间多一点,因为listRoles() 通过公开的 API 直接与 IAM 对话,而另一个请求正在与不同的服务对话即通过可能不同的(AWS/内部)接口与 IAM 通信,其中可能存在额外的传播延迟。潜在有用:How long should I wait after applying an AWS IAM policy before it is valid? 这个问题是关于用户策略+S3 而不是角色+SNS,但答案应该同样适用。 +1
    • @Michael-sqlbot 这很有趣——我没有考虑过。感谢您注意到这一点。
    • 我在 AWS 控制台(嗯,SNS 控制台)中遇到了这种情况,当我第二次尝试时,它起作用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 2018-12-13
    • 2013-11-28
    • 2011-06-19
    相关资源
    最近更新 更多