1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
| package main
import (
"bytes"
"context"
"fmt"
"log"
"os"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/endpoints"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
func HandleRequest(ctx context.Context) (string, error) {
var BUCKET = os.Getenv("BUCKET")
var KEY = os.Getenv("KEY")
svc := s3.New(session.New(), &aws.Config{
Region: aws.String(endpoints.ApNortheast1RegionID),
})
// ファイルの存在確認
loo, errlo := svc.ListObjectsV2(&s3.ListObjectsV2Input{
Bucket: aws.String(BUCKET),
Prefix: aws.String(KEY),
})
if errlo != nil {
if aerr, ok := errlo.(awserr.Error); ok {
switch aerr.Code() {
case s3.ErrCodeNoSuchBucket:
log.Print("bucket does not exist at ListObjectsV2")
return "bucket does not exis at tListObjectsV2", aerr
default:
log.Printf("aws error %v at ListObjectsV2", aerr.Error())
return "aws error at ListObjectsV2", aerr
}
}
log.Printf("error %v at ListObjectsV2", errlo.Error())
return "error at ListObjectsV2", errlo
}
wb := new(bytes.Buffer) // write buffer
if *loo.KeyCount == 0 {
// 新規作成
fmt.Fprint(wb, "header1,header2,header3\n") // ヘッダー
} else {
// Object取得
goo, errgo := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(BUCKET),
Key: aws.String(KEY),
})
defer goo.Body.Close()
if errgo != nil {
if aerr, ok := errgo.(awserr.Error); ok {
switch aerr.Code() {
case s3.ErrCodeNoSuchBucket:
log.Print("bucket does not exist at GetObject")
return "bucket does not exist at GetObject", aerr
case s3.ErrCodeNoSuchKey:
// 新規作成
log.Print("object with key does not exist in bucket at GetObject")
return "object with key does not exist in bucket at GetObject", aerr
default:
log.Printf("aws error %v at GetObject", aerr.Error())
return "aws error at GetObject", aerr
}
}
log.Printf("error %v at GetObject", errgo.Error())
return "error at GetObject", errgo
}
brb := new(bytes.Buffer) // buffer Response Body
brb.ReadFrom(goo.Body)
srb := brb.String() // string Response Body
fmt.Fprint(wb, srb) // 読み取りデータ
}
fmt.Fprint(wb, "col1,col2,col3\n") // 追記データ
_, errpo := svc.PutObject(&s3.PutObjectInput{
Body: bytes.NewReader(wb.Bytes()),
Bucket: aws.String(BUCKET),
Key: aws.String(KEY),
ACL: aws.String("private"),
ServerSideEncryption: aws.String("AES256"),
})
if errpo != nil {
if aerr, ok := errpo.(awserr.Error); ok {
log.Printf("aws error %v at PutObject", aerr.Error())
return "aws error at PutObject", aerr
}
log.Printf("error %v at PutObject", errpo.Error())
return "error at PutObject", errpo
}
defer log.Print("normal end")
return "normal end", nil
}
func main() {
lambda.Start(HandleRequest)
}
|