私は、Googleで認証されたCognito認証プロバイダを使用してAndroidから直接ラムダを呼び出しています。私がその資格証明プロバイダを使用することによって得られる役割は、私がラムダを呼び出すことを可能にします。クラウドウォッチのログでは、ラムダが実際にラムダハンドラに渡されたコンテキスト変数でユーザーのCognito IDを受け取ることがわかります。ラムダは、このID変数を使用して、Cognito ID変数によって指定された特定のS3ユーザーフォルダへのラムダのアクセスを制限する役割を引き受けます。AWSラムダは一時的なアクセス権を取得するときにCognitoポリシー変数を使用しますか?
{
"Effect":"Allow",
"Action":[
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject"
],
"Resource":[
"arn:aws:s3:::BUCKET_NAME/users/${cognito-identity.amazonaws.com:sub}/",
"arn:aws:s3:::BUCKET_NAME/users/${cognito-identity.amazonaws.com:sub}/*"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ListBucket",
"s3:ListObjects"
],
"Resource":[
"arn:aws:s3:::BUCKET_NAME"
],
"Condition":{
"StringLike":{
"s3:prefix":[
"users/${cognito-identity.amazonaws.com:sub}/",
"users/${cognito-identity.amazonaws.com:sub}/*"
]
}
}
}
ただし、ラムダはこれらの環境変数の特定の制限を継承していないようです。動作するようにラムダコードのために、私はこのような制約を緩める必要があります。
{
"Effect":"Allow",
"Action":[
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject"
],
"Resource":[
"arn:aws:s3:::BUCKET_NAME/users/*"
]
},
{
"Effect":"Allow",
"Action":[
"s3:ListBucket",
"s3:ListObjects"
],
"Resource":[
"arn:aws:s3:::BUCKET_NAME"
],
"Condition":{
"StringLike":{
"s3:prefix":[
"users/*"
]
}
}
}
私はそれが役割を想定したラムダサービスに関係していると思います。 S3クライアントで直接役割を使用する場合、制限が機能するようです。クライアントは自分のフォルダにアクセスできますが、他の人はアクセスできません。しかし、ラムダが役割を引き受けた場合、ラムダは機能しません。ポリシーの制約を緩和する必要があります。間違ったことや誤解をしていますか?