Skip to content

Instantly share code, notes, and snippets.

@skanehira
Created July 11, 2022 05:04
Show Gist options
  • Save skanehira/f700a3950f88b83b6baa751fb8c9db18 to your computer and use it in GitHub Desktop.
Save skanehira/f700a3950f88b83b6baa751fb8c9db18 to your computer and use it in GitHub Desktop.
package main
import (
"bytes"
"context"
"encoding/base64"
"fmt"
"log"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"golang.org/x/sync/errgroup"
"golang.org/x/sync/semaphore"
)
// 100並行までのセマフォを作る
var s *semaphore.Weighted = semaphore.NewWeighted(100)
func main() {
// base64の文字列の配列
images := []string{}
sess := session.Must(session.NewSession())
uploader := s3manager.NewUploader(sess)
ctx := context.Background()
// エラーがあった場合、処理を中断するため errogroup.Group を使う
var eg errgroup.Group
for i := range images {
// シャドーイングを回避
image := images[i]
eg.Go(func() error {
// 重みを追加
s.Acquire(ctx, 1)
// 重みをリリース
defer s.Release(1)
b, err := base64.StdEncoding.DecodeString(image)
if err != nil {
return fmt.Errorf("failed to decode image from base64 string: %w", err)
}
// make object key
key := ""
// upload to s3
_, err = uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String("bucket"),
Key: aws.String(key),
Body: bytes.NewBuffer(b),
})
if err != nil {
return fmt.Errorf("failed to upload s3: %w", err)
}
return nil
})
}
if err := eg.Wait(); err != nil {
log.Fatalf("faield to convert or upload image: %s", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment