0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

S3に保存されているCSVファイルをjsonレスポンスで受け取る

Posted at

概要

この記事では、S3上に保存されたCSVファイルをLambdaで取り出し、jsonで返す方法を紹介します。
HTTP通信の窓口にはAPIGatewayを使用しています。
APIGatewayのイベントをトリガーにLambdaからS3へアクセスします。

この記事では、S3のポリシー設定、Lambdaのロール設定、LambdaとAPIGatewayの設定は割愛し、Lambdaの実装にフォーカスします。

前提条件

CSVファイルは以下のものを使用しました。
全体のソースコードは下に載せます。
またAWSサービスの認証はそれぞれの環境でお願いします。

hoge.csv
"name","age"
"fuga","22"
"hoge","20"

Lambdaの実装

実装にはGoを用います。
大まかに以下の流れです。

  1. s3にアクセスするためのクライアントを作成
  2. s3からオブジェクトを取得する
  3. オブジェクトを構造体にマーシャルする
  4. 全ての処理が成功したらレスポンスを返す

以下で詳しく説明していきます。

LambdaからS3にアクセスするための設定

S3にアクセスするためのクライアントを作成し、バケット名とファイル名で検索しています。

main.go
func hander(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
	session := session.New()
	s3Client := s3.New(session)

	bucketName := "qiitahoge"
	objectKey := "hoge.csv"

	object, err := s3Client.GetObject(&s3.GetObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(objectKey),
	})
	if err != nil {
		return events.APIGatewayProxyResponse{
			Body:       err.Error(),
			StatusCode: 500,
		}, nil
	}
    ...
}

S3オブジェクトを読み込む

標準パッケージであるencoding/csvを使ってCSVファイルを読み込みます。

main.go
func hander(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    ...
    defer object.Body.Close()
	reader := csv.NewReader(object.Body)
	rows, err := reader.ReadAll()
	if err != nil {
		return events.APIGatewayProxyResponse{
			Body:       err.Error(),
			StatusCode: 500,
		}, nil
	}
    ...
}

読み込んだ結果を構造体に割り当てる

Hogeという構造体を定義し、CSVの読み込み結果を割り当てます。

main.go
type Hoge struct {
	Name string `json: "name"`
	Age  string `json: "age"`
}

func hander(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    ...
	var response []Hoge
	for i, v := range rows {
		if i == 0 {
			continue
		}

		name := v[0]
		age := v[1]

		hoge := Hoge{
			Name: name,
			Age:  age,
		}

		response = append(response, hoge)
	}
    ...
}

レスポンス実装

今までの処理で問題がなければ、ステータスコード200と共にjsonオブジェクトを返してあげます。

main.go
func hander(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    ...
	bytes, err := json.Marshal(response)
	if err != nil {
		return events.APIGatewayProxyResponse{
			Body:       err.Error(),
			StatusCode: 500,
		}, nil
	}

	return events.APIGatewayProxyResponse{
		Body:       string(bytes),
		StatusCode: 200,
	}, nil
}

func main() {
	lambda.Start(hander)
}

最後に

上の手順でlambdaの実装は完了です。
この後にgoファイルを圧縮して、lambdaにアップロードします。
最後に、LambdaAPIGatewayを繋いでAPIの完成です。
Postmanからリクエストを送ったところ、CSVの内容をjsonで確認することができました。

全ソースコードはこちらです。

参考

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?