概要

AWS SDK for Go を触ってみる。

目次

Go Lambda のハンドラ

基本形

有効な関数ハンドラは以下のページに記載されている通り。
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)
}

Lambdaプロキシ統合を使用する場合

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)
}

SAM CLI によるローカルでの動作確認

ハンドラをビルドしておく

GOOS=linux GOARCH=amd64 go build -o sample sample.go

template.yml の作成

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

SAM CLI で Lambda をinvoke

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"

SAM CLI で API を起動

ローカルで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

パッケージング

TODO:

デプロイ

TODO:

実装メモ

S3へのアクセス

TODO:

DynamoDBへのアクセス

TODO:

メトリクス一覧を取得する

TODO:

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 
}

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS