AWS SDK for Go を触ってみる。
有効な関数ハンドラは以下のページに記載されている通り。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-programming-model-handler-types.html#go-programming-model-handler-types-signatures
例)
package main import ( "github.com/aws/aws-lambda-go/lambda" ) func hello() (string, error) { return "Hello World!", nil } func main() { lambda.Start(hello) }
API Gateway用のLambdaで Lambdaプロキシ統合を使用する場合、
リクエストデータの受け取りには events.APIGatewayProxyRequest を、レスポンスデータの設定には events.APIGatewayProxyResponse を使用する。
https://github.com/aws/aws-lambda-go/blob/master/events/apigw.go
上記URLを見る限り、各パラメータはそれぞれ以下の通り取得できると思われる。
パラメータ種別 | 取得方法 | 補足 |
GETパラメータ | APIGatewayProxyRequest.QueryStringParameters | |
POSTデータ | APIGatewayProxyRequest.Body | 恐らく文字列として取得される為、JSONエンコードが必要? |
PATHパラメータ | APIGatewayProxyRequest.PathParameters | |
リソース名 | APIGatewayProxyRequest.Resource |
sample.go
package main import ( "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { return events.APIGatewayProxyResponse{ Body: fmt.Sprintf("Hello %s!", request.QueryStringParameters["name"]), StatusCode: 200, }, nil } func main() { lambda.Start(handler) }
GOOS=linux GOARCH=amd64 go build -o sample sample.go
AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 Resources: SampleFunction: Type: AWS::Serverless::Function Properties: Handler: sample Runtime: go1.x Tracing: Active Events: GetEvent: Type: Api Properties: Path: / Method: get
sample_request.json
{ "path": "/", "httpMethod": "GET", "queryStringParameters": { "name": "Sample2" } }
イベントJSONの内容を入力として invoke
sam local invoke "SampleFunction" -e sample_request.json
標準入力からリクエストデータを渡す場合は -e に "-" を指定する。(JSONを作りたくない場合)
echo '{"path": "/", "httpMethod": "GET", "queryStringParameters": {"name": "Sample2"}}' | sam local invoke -e "-" "SampleFunction"
ローカルでAPI Gatewayを起動
sam local start-api --template template.yml
動作確認
curl http://127.0.0.1:3000/?name=Taro Hello Taro!
GOPATHを通しておく
export GOPATH=/usr/local/Cellar/go/1.13.5
必要なライブラリをgo getしておく
go get github.com/aws/aws-lambda-go/lambda
ビルド
GOOS=linux GOARCH=amd64 go build -o main main.go
ec2metrics.go
package main import ( "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awsutil" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/cloudwatch" ) func main() { region := "ap-northeast-1" accessKeyId := "XXXXXXXXXXXXXXXXXXXXXX" secretAccessKey := "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" value, err := getAllMetrics(region, accessKeyId, secretAccessKey) fmt.Printf("%+v", value) if err != nil{ fmt.Printf("Error!") } } /** * メトリクスの一覧を取得する. */ func getAllMetrics(region string, accessKeyId string, secretAccessKey string) (cloudwatch.ListMetricsOutput, error) { namespace := "AWS/EC2" //metric := "CPUUtilization" creds, err := GetCredentials(accessKeyId, secretAccessKey) if err != nil { return cloudwatch.ListMetricsOutput{}, err } cfg := &aws.Config{ Region: aws.String(region), Credentials: creds, } sess, err := session.NewSession(cfg) if err != nil { return cloudwatch.ListMetricsOutput{}, err } svc := cloudwatch.New(sess, cfg) params := &cloudwatch.ListMetricsInput{ Namespace: aws.String(namespace), //MetricName: aws.String(metric), } var resp cloudwatch.ListMetricsOutput err = svc.ListMetricsPages(params, func(page *cloudwatch.ListMetricsOutput, lastPage bool) bool { metrics, _ := awsutil.ValuesAtPath(page, "Metrics") for _, metric := range metrics { resp.Metrics = append(resp.Metrics, metric.(*cloudwatch.Metric)) } return !lastPage }) if err != nil { return resp, err } return resp, err } /** * クレデンシャル取得. */ func GetCredentials(accessKeyId string, secretAccessKey string) (*credentials.Credentials, error) { creds := credentials.NewChainCredentials( []credentials.Provider{ &credentials.StaticProvider{Value: credentials.Value{ AccessKeyID: accessKeyId, SecretAccessKey: secretAccessKey, }}, //&credentials.EnvProvider{}, }) return creds, nil }