私は当初、この問題はリージョンの不一致が原因であると考えていましたが、リージョンを変更した後も、ここにあるAmazon AWSサンプルを試してみると、次のエラーが発生します。
AmazonServiceException: User: arn:aws:sts::[My Account
ARN]:assumed-role/Cognito_AndroidAppUnauth_DefaultRole/ProviderSession
is not authorized to perform: dynamodb:DescribeTable on resource:
arn:aws:dynamodb:us-east-1:[My Account ARN]:table/test_table (Service:
AmazonDynamoDBv2; Status Code: 400; Error Code: AccessDeniedException;
Request ID: BBFTS0Q8UHTMG120IORC2KSASVVV4KQNSO5AEMVJF66Q9ASUAAJG)
すべてがほぼ同じですが、変更したのはDBclient
リージョンをUS_EAST_1
に変更したことだけです。テストテーブルがホストされ、 'からの情報を使用して定数ファイルが変更されます。 Cognito入門ドキュメントに従って生成されたAmazon Cognito Starter Code 'ページ。
私のCognito_AndroidAppUnauth_DefaultRole
ロールポリシーでは、デフォルトのモバイル分析と同期サービスのアクセス許可を変更して、既存または非存在のすべてのテーブルのすべてのアクションへのアクセスも含めるようにしました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CognitoPolicy",
"Action": [
"mobileanalytics:PutEvents",
"cognito-sync:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
},
{
"Sid": "DynamoDBPolicy",
"Effect": "Allow",
"Action": [
"dynamodb: *"
],
"Resource": "*"
}
]
}
それでは、正しいリージョンが使用されているときに権限がないと主張し、Unauthポリシーでテーブルアクセスを許可する必要があるのはなぜですか?
編集:DynamoDBリソースのメソッドを呼び出すときのスタックトレース(テーブルの作成)
com.amazonaws.AmazonServiceException: User: arn:aws:sts::[My Account ARN]:assumed-role/Cognito_AndroidAppUnauth_DefaultRole/ProviderSession is not authorized to perform: dynamodb:CreateTable on resource: arn:aws:dynamodb:us-east-1:[My Account ARN]:table/test_table (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: AccessDeniedException; Request ID: SDELNSMLO10EV7CM2STC1R9RU3VV4KQNSO5AEMVJF66Q9ASUAAJG)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(Unknown Source)
at com.amazonaws.http.AmazonHttpClient.executeHelper(Unknown Source)
at com.amazonaws.http.AmazonHttpClient.execute(Unknown Source)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(Unknown Source)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.createTable(Unknown Source)
at com.amazonaws.demo.userpreferencesom.DynamoDBManager.createTable(DynamoDBManager.Java:72)
at com.amazonaws.demo.userpreferencesom.UserPreferenceDemoActivity$DynamoDBManagerTask.doInBackground(UserPreferenceDemoActivity.Java:99)
at com.amazonaws.demo.userpreferencesom.UserPreferenceDemoActivity$DynamoDBManagerTask.doInBackground(UserPreferenceDemoActivity.Java:85)
at Android.os.AsyncTask$2.call(AsyncTask.Java:288)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:237)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1112)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:587)
at Java.lang.Thread.run(Thread.Java:841)
Amazonエンジニアと協力して、問題がポリシー構成にあることがわかりました:
"dynamodb: *"
する必要があります
"dynamodb:*"
スペースができることは驚くべきことです。