LoginSignup
4
4

More than 5 years have passed since last update.

AWS Lambda Goで画像アップローダを作る

Last updated at Posted at 2019-01-26

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で認証処理を検証する予定。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4