我有一个运行在EC2实例上的asp.net网站,该实例具有通过AmazonS3FullAccess策略分配给它的IAM角色。对于在我可以上载,删除和获取S3存储桶中存储的图像的预签名URL的网站,此方法很好用。
在同一EC2实例上,我还具有一个asp.net API,供移动应用程序访问各种数据。当我尝试使用API获取存储在S3中的图像的预签名URL时,抛出以下错误。
Object reference not set to an instance of an object.
at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.FetchCredentials()
at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentials()
at Amazon.S3.AmazonS3Client.GetPreSignedURLInternal(GetPreSignedUrlRequest request, Boolean useSigV2Fallback)
获取预签名链接的代码与网站和API相同
Dim bucketRegion = RegionEndpoint.EUWest1
Dim s3Client As New AmazonS3Client(bucketRegion)
Dim request1 = New GetPreSignedUrlRequest
request1.BucketName = "mybucketname"
request1.Key = fileName
request1.Expires = DateTime.Now.AddMinutes(1080)
dim signedURL = s3Client.GetPreSignedURL(request1)
在GetPreSignedURL行上引发了错误。
我无法弄清楚为什么IAM角色权限适用于网站,但不适用于同一服务器上托管的API。
答案 0 :(得分:0)
iam角色在本地没有凭据,对于创建预签名的url,我们需要具有凭据。
aws iam异步获取凭据。 因此,如果使用iam角色,则应该异步调用预签名的url函数。
参考:
.p的: https://docs.aws.amazon.com/sdkfornet/v3/apidocs/index.html
对于Nodejs: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property