AWS Serverless Uploader
デモ https://aws-serverless-uploader.netlify.com/
フロントエンドソース https://github.com/dyoshikawa/aws-serverless-uploader-frontend
バックエンドソース https://github.com/dyoshikawa/aws-serverless-uploader-go
フロントエンド
- React
- Netlify
ReactプロジェクトをNetlifyにデプロイ。
CSSフレームワークはBulma。
API通信はAxiosを使用。
バックエンド
- AWS Lambda Go
- API Gateway
- S3
- DynamoDB
- SAM CLI
Serverless frameworkかSAM CLIかは好きな方で良さそう。
自分的にはAWS謹製という点に惹かれてSAM CLIを選定。
sam init --runtime go
でプロジェクトの雛形をバッと作ってくれてすぐにデプロイできるのと、AWS上の構成をコード管理できる(=infrastructure as code)ので重宝した。
GoでS3
aws-sdk-goを使用。
package main
import (
"bytes"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func s3Put(img []byte) error {
svc := s3.New(session.New(), &aws.Config{
Region: aws.String("ap-northeast-1"),
})
if _, err := svc.PutObject(&s3.PutObjectInput{
Bucket: aws.String("バケット名"),
ACL: aws.String("private"),
ServerSideEncryption: aws.String("AES256"),
Key: aws.String("キー名"),
Body: bytes.NewReader(img),
}); err != nil {
return err
}
return nil
}
GoでDynamoDB
素のaws-sdk-goだけの実装はダルいようなのでgregu/dynamoライブラリを使用。
package main
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/guregu/dynamo"
)
type Image struct {
Name string `json:"name" dynamo:"Name"`
URL string `json:"url" dynamo:"Url"`
CreatedAt string `json:"createdAt" dynamo:"CreatedAt"`
}
// 書き込み
func dynamoPut(data Image) error {
db := dynamo.New(session.New(), &aws.Config{Region: aws.String("ap-northeast-1")})
if err := db.Table("テーブル名").Put(data).Run(); err != nil {
return err
}
return nil
}
// 全件取得
func dynamoGetAll(data *[]Image) error {
db := dynamo.New(session.New(), &aws.Config{Region: aws.String("ap-northeast-1")})
if err := db.Table("テーブル名").Scan().All(data); err != nil {
return err
}
return nil
}
次はAPIGateway+Lambda(Go)+Cognitoで認証処理を検証する予定。