#author("2019-12-30T08:44:47+00:00","","") #mynavi(AWSメモ) #setlinebreak(on); * 概要 [#baf9a431] #html(<div class="pl10">) [[AWS SDK for Go>https://aws.amazon.com/jp/sdk-for-go/]] を触ってみる。 #html(</div>) * 目次 [#n8f6e596] #contents - 関連 -- [[Go言語]] -- [[AWSメモ]] - 参考 -- https://aws.amazon.com/jp/sdk-for-go/ -- https://docs.aws.amazon.com/lambda/latest/dg/go-programming-model.html -- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-programming-model-handler-types.html -- https://github.com/aws/aws-lambda-go -- https://github.com/sbstjn/go-lambda-example * Go Lambda のハンドラ [#r9c95b8b] #html(<div class="pl10">) ** 基本形 [#mabb1221] #html(<div class="pl10">) 有効な関数ハンドラは以下のページに記載されている通り。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-programming-model-handler-types.html#go-programming-model-handler-types-signatures 例) #mycode2(){{ package main import ( "github.com/aws/aws-lambda-go/lambda" ) func hello() (string, error) { return "Hello World!", nil } func main() { lambda.Start(hello) } }} #html(</div>) ** Lambdaプロキシ統合を使用する場合 [#t0777c47] #html(<div class="pl10">) API Gateway用のLambdaで Lambdaプロキシ統合を使用する場合、 リクエストデータの受け取りには events.APIGatewayProxyRequest を、レスポンスデータの設定には events.APIGatewayProxyResponse を使用する。 https://github.com/aws/aws-lambda-go/blob/master/events/apigw.go 上記URLを見る限り、各パラメータはそれぞれ以下の通り取得できると思われる。 | パラメータ種別 | 取得方法 | 補足 |h | GETパラメータ | APIGatewayProxyRequest.QueryStringParameters || | POSTデータ | APIGatewayProxyRequest.Body | 恐らく文字列として取得される為、JSONエンコードが必要? | | PATHパラメータ | APIGatewayProxyRequest.PathParameters || | リソース名 | APIGatewayProxyRequest.Resource || sample.go #mycode2(){{ 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) } }} #html(</div>) #html(</div>) * SAM CLI によるローカルでの動作確認 [#he04f37f] #html(<div class="pl10">) ** ハンドラをビルドしておく [#fcc6d4af] #html(<div class="pl10">) #myterm2(){{ GOOS=linux GOARCH=amd64 go build -o sample sample.go }} #html(</div>) ** template.yml の作成 [#n66669fb] #html(<div class="pl10">) #mycode2(){{ 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 }} #html(</div>) ** SAM CLI で Lambda をinvoke [#p86fb77d] #html(<div class="pl10">) sample_request.json #mycode2(){{ { "path": "/", "httpMethod": "GET", "queryStringParameters": { "name": "Sample2" } } }} イベントJSONの内容を入力として invoke #myterm2(){{ sam local invoke "SampleFunction" -e sample_request.json }} 標準入力からリクエストデータを渡す場合は -e に "-" を指定する。(JSONを作りたくない場合) #myterm2(){{ echo '{"path": "/", "httpMethod": "GET", "queryStringParameters": {"name": "Sample2"}}' | sam local invoke -e "-" "SampleFunction" }} #html(</div>) ** SAM CLI で API を起動 [#y602bcbb] #html(<div class="pl10">) ローカルでAPI Gatewayを起動 #myterm2(){{ sam local start-api --template template.yml }} 動作確認 #myterm2(){{ curl http://127.0.0.1:3000/?name=Taro Hello Taro! }} #html(</div>) #html(</div>) * ビルド [#w404a51e] #html(<div class="pl10">) GOPATHを通しておく #myterm2(){{ export GOPATH=/usr/local/Cellar/go/1.13.5 }} 必要なライブラリをgo getしておく #myterm2(){{ go get github.com/aws/aws-lambda-go/lambda }} ビルド #myterm2(){{ GOOS=linux GOARCH=amd64 go build -o main main.go }} #html(</div>) * パッケージング [#q447a087] #html(<div class="pl10">) #TODO #html(</div>) * デプロイ [#wb9e2c9e] #html(<div class="pl10">) #TODO #html(</div>) * 実装メモ [#d8c9b220] #html(<div class="pl10">) ** S3へのアクセス [#ead5dc71] #html(<div class="pl10">) #TODO #html(</div>) ** DynamoDBへのアクセス [#p18da634] #html(<div class="pl10">) #TODO #html(</div>) ** メトリクス一覧を取得する [#c1344765] #html(<div class="pl10">) #TODO ec2metrics.go #mycode2(){{ 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 } }} #html(</div>) #html(</div>)