You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

s3.go 2.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package s3
  2. import (
  3. "fmt"
  4. "github.com/aws/aws-sdk-go-v2/aws"
  5. "github.com/aws/aws-sdk-go-v2/credentials"
  6. "github.com/aws/aws-sdk-go-v2/service/s3"
  7. clitypes "gitlink.org.cn/cloudream/storage2/client/types"
  8. "gitlink.org.cn/cloudream/storage2/common/pkgs/storage/factory/reg"
  9. "gitlink.org.cn/cloudream/storage2/common/pkgs/storage/types"
  10. "gitlink.org.cn/cloudream/storage2/common/pkgs/storage/utils"
  11. cortypes "gitlink.org.cn/cloudream/storage2/coordinator/types"
  12. )
  13. func init() {
  14. reg.RegisterBuilder[*cortypes.S3Type](newBuilder)
  15. }
  16. type builder struct {
  17. types.EmptyBuilder
  18. detail *clitypes.UserSpaceDetail
  19. }
  20. func newBuilder(detail *clitypes.UserSpaceDetail) types.StorageBuilder {
  21. return &builder{
  22. detail: detail,
  23. }
  24. }
  25. func (b *builder) FeatureDesc() types.FeatureDesc {
  26. return types.FeatureDesc{
  27. HasBypassWrite: true,
  28. HasBypassRead: true,
  29. HasBypassHTTPRead: false,
  30. }
  31. }
  32. func (b *builder) CreateShardStore() (types.ShardStore, error) {
  33. s3Cred, ok := b.detail.UserSpace.Credential.(*cortypes.S3Cred)
  34. if !ok {
  35. return nil, fmt.Errorf("invalid storage credential type %T for s3 storage", b.detail.UserSpace.Credential)
  36. }
  37. cli, bkt, err := createClient(s3Cred)
  38. if err != nil {
  39. return nil, err
  40. }
  41. return NewShardStore(b.detail, cli, bkt, ShardStoreOption{UseAWSSha256: true})
  42. }
  43. func (b *builder) CreatePublicStore() (types.PublicStore, error) {
  44. s3Cred, ok := b.detail.UserSpace.Credential.(*cortypes.S3Cred)
  45. if !ok {
  46. return nil, fmt.Errorf("invalid storage credential type %T for s3 storage", b.detail.UserSpace.Credential)
  47. }
  48. cli, bkt, err := createClient(s3Cred)
  49. if err != nil {
  50. return nil, err
  51. }
  52. return NewPublicStore(b.detail, cli, bkt)
  53. }
  54. func createClient(cred *cortypes.S3Cred) (*s3.Client, string, error) {
  55. awsConfig := aws.Config{}
  56. if cred.AK != "" && cred.SK != "" {
  57. cre := aws.Credentials{
  58. AccessKeyID: cred.AK,
  59. SecretAccessKey: cred.SK,
  60. }
  61. awsConfig.Credentials = &credentials.StaticCredentialsProvider{Value: cre}
  62. }
  63. awsConfig.Region = cred.Region
  64. options := []func(*s3.Options){}
  65. options = append(options, func(s3Opt *s3.Options) {
  66. s3Opt.BaseEndpoint = &cred.Endpoint
  67. })
  68. cli := s3.NewFromConfig(awsConfig, options...)
  69. return cli, cred.Bucket, nil
  70. }
  71. func (b *builder) CreateMultiparter() (types.Multiparter, error) {
  72. feat := utils.FindFeature[*cortypes.MultipartUploadFeature](b.detail.Storage)
  73. if feat == nil {
  74. return nil, fmt.Errorf("feature %T not found", cortypes.MultipartUploadFeature{})
  75. }
  76. s3Cred, ok := b.detail.UserSpace.Credential.(*cortypes.S3Cred)
  77. if !ok {
  78. return nil, fmt.Errorf("invalid storage credential type %T for s3 public store", b.detail.UserSpace.Credential)
  79. }
  80. cli, bucket, err := createClient(s3Cred)
  81. if err != nil {
  82. return nil, err
  83. }
  84. return NewMultiparter(
  85. b.detail,
  86. feat,
  87. bucket,
  88. cli,
  89. ), nil
  90. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。