2016-10-02 18 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:ARN:AWS:IAM :: 1234567890:役割/ SNSFailureFeedback理由属性(サービス:AmazonSNS;ステータスコード:400;エラーコード:InvalidParameter;リクエストID:c1dbd591-f044-584a-bbac-85fa9a0cbe8d)

遅延を追加するだけの場合は、 (例えば、Thread.sleep(5000))ロールの作成後、プラットフォームアプリケーションの作成前に、プラットフォームアプリケーションが正常に作成されます。エラーなし。

したがって、配信ステータスが有効になっているロールとプラットフォームアプリケーションを作成する適切な方法は何ですか?

答えて

2

ロールの作成時に最終的な整合性が失われています。時間遅延は、ロールが次のAPI要求に対して「可視」になるまでの時間を可能にします。任意の時間遅延の代わりに、IAMの役割を列挙して、必要な役割が「可視」かどうかを確認できます。

+0

役割が「可視」でない場合の対処方法 –

+0

'listRoles()'リクエストでそのロールが返されているかどうかをチェックすることをおすすめします。ロールが返されない場合は、1秒待ってから再度チェックしてください。こうすることで、 'createPlatformApplication()'呼び出しが行われたときにその役割が利用可能であることが保証されます。 – jbird

+1

'listRoles()'はエクスポーズされたAPIを介して直接IAMと話しているが、他のリクエストは話している別のサービスに話しているので、実際には 'listRoles()'が返すのに少し時間を要するかもしれません潜在的に異なる(AWS /内部)インタフェースを介してIAMに送信し、追加伝搬遅延が生じる可能性があります。潜在的に有用:[有効になる前にAWS IAMポリシーを適用した後、どれくらい待つ必要がありますか?](http://stackoverflow.com/q/20156043/1695906)この質問は、ロール+ SNSではなくユーザーポリシー+ S3についてですが、答えは同様に適用できるはずです。 +1 –

関連する問題