用于S3访问的AWS EC2 IAM角色不起作用

时间:2019-06-12 11:25:41

标签: asp.net amazon-web-services amazon-s3 amazon-ec2 amazon-iam

我有一个运行在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。

1 个答案:

答案 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