使用 amplify-angular 访问任意 S3 object
Access arbitrary S3 object using amplify-angular
我已经 amplify-angular 配置了身份验证和 API 访问权限。使用 Angular 5.
我可以访问私有 S3 资源并利用 API 访问期间使用的相同身份验证吗?
具体来说,我想向 S3 object 发出 REST GET 请求,例如:
https://s3.amazonaws.com/my-bucket-name/my-private-file.dat
需要包含 AWS 签名作为授权 header 才能正常工作。 (假设用户有权限)
可能的选项:
- The RestClient class:它似乎可以满足我的要求,但我不认为它已导出或可供我的应用程序代码使用
- API : 我可以在放大配置中定义另一个 API 作为
https://s3.amazonaws.com
吗?我不确定 side-effects 将其视为 API 网关实例而不是......无论它是什么。
我不能在 S3 访问前面放置一个 API 端点;基于直接 S3 访问,ACL 将更容易检查,因为它们每个 object.
都有单独的 ACL
"Storage" 模块似乎不合适。这似乎只适用于 pre-determined 存储桶。我的访问模式可以转到运行时之前未知的任意数量的存储桶。
我能够使用存储模块,但这是一个 hack。
const storage = this.amplifyService.storage();
const storageOptions = {
bucket: 'any-bucket',
// see https://github.com/aws/aws-amplify/blob/master/packages/aws-amplify/src/Storage/Storage.ts#L325
// public appears to be the only option that doesn't append hardcoded values
customPrefix: {
public: ''
},
level: 'public'
};
storage.get( 'objectIdWithinBucket', storageOptions ).then(
data => {
console.log( "A signed URL is returned that can be used to access the object");
console.log( data );
},
error => {
console.log( "Boo. Err. ", error );
}
)
为什么会这样:自定义前缀和 public 级别会覆盖默认的 s3 参数。该资源实际上不是 public,但任何其他选项都会附加不属于的斜杠和额外字符。
存储模块(在我看来)是一个糟糕的 API 设计示例:它们提供的值基于未记录的预期用例。在我能找到的任何地方都没有记录覆盖它们的能力。示例:如果您未指定 "level",它会将 "public" 作为前缀附加到对象 ID。
更重要的是,存储模块假定登录用户将对象存储在具有已知命名约定的单个存储桶中。改变这些很难。
警告:覆盖可能会将传递的参数分配给默认的 _options。这将发生在 https://github.com/aws/aws-amplify/blob/240e50b61f50eaf3712bfbc088d1b096360b401c/packages/aws-amplify/src/Storage/Storage.ts#L86(在撰写本文时最近一次提交的快照)
还有可能使用 <amplify-s3-image>
组件。
<amplify-s3-image [path]="mainImage?.key" [options]="{customPrefix: {public: ''}}">
</amplify-s3-image>
mainImage-Object 是通过 amplify graphql 上传的,如下所示:
"mainImage": {
"bucket": "bucketname",
"region": "eu-central-1",
"key": "public/b369e63d-1a40-4793-ae49-cecde042b1b9.jpg",
"__typename": "S3Object"
},
我找不到这方面的任何文档,所以这里是 link 到 code on github。
我已经 amplify-angular 配置了身份验证和 API 访问权限。使用 Angular 5.
我可以访问私有 S3 资源并利用 API 访问期间使用的相同身份验证吗?
具体来说,我想向 S3 object 发出 REST GET 请求,例如:
https://s3.amazonaws.com/my-bucket-name/my-private-file.dat
需要包含 AWS 签名作为授权 header 才能正常工作。 (假设用户有权限)
可能的选项:
- The RestClient class:它似乎可以满足我的要求,但我不认为它已导出或可供我的应用程序代码使用
- API : 我可以在放大配置中定义另一个 API 作为
https://s3.amazonaws.com
吗?我不确定 side-effects 将其视为 API 网关实例而不是......无论它是什么。
我不能在 S3 访问前面放置一个 API 端点;基于直接 S3 访问,ACL 将更容易检查,因为它们每个 object.
都有单独的 ACL"Storage" 模块似乎不合适。这似乎只适用于 pre-determined 存储桶。我的访问模式可以转到运行时之前未知的任意数量的存储桶。
我能够使用存储模块,但这是一个 hack。
const storage = this.amplifyService.storage();
const storageOptions = {
bucket: 'any-bucket',
// see https://github.com/aws/aws-amplify/blob/master/packages/aws-amplify/src/Storage/Storage.ts#L325
// public appears to be the only option that doesn't append hardcoded values
customPrefix: {
public: ''
},
level: 'public'
};
storage.get( 'objectIdWithinBucket', storageOptions ).then(
data => {
console.log( "A signed URL is returned that can be used to access the object");
console.log( data );
},
error => {
console.log( "Boo. Err. ", error );
}
)
为什么会这样:自定义前缀和 public 级别会覆盖默认的 s3 参数。该资源实际上不是 public,但任何其他选项都会附加不属于的斜杠和额外字符。
存储模块(在我看来)是一个糟糕的 API 设计示例:它们提供的值基于未记录的预期用例。在我能找到的任何地方都没有记录覆盖它们的能力。示例:如果您未指定 "level",它会将 "public" 作为前缀附加到对象 ID。
更重要的是,存储模块假定登录用户将对象存储在具有已知命名约定的单个存储桶中。改变这些很难。
警告:覆盖可能会将传递的参数分配给默认的 _options。这将发生在 https://github.com/aws/aws-amplify/blob/240e50b61f50eaf3712bfbc088d1b096360b401c/packages/aws-amplify/src/Storage/Storage.ts#L86(在撰写本文时最近一次提交的快照)
还有可能使用 <amplify-s3-image>
组件。
<amplify-s3-image [path]="mainImage?.key" [options]="{customPrefix: {public: ''}}">
</amplify-s3-image>
mainImage-Object 是通过 amplify graphql 上传的,如下所示:
"mainImage": {
"bucket": "bucketname",
"region": "eu-central-1",
"key": "public/b369e63d-1a40-4793-ae49-cecde042b1b9.jpg",
"__typename": "S3Object"
},
我找不到这方面的任何文档,所以这里是 link 到 code on github。