概要

Grafana に関わる機会があったのだが、Grafana ではAWS EC2のメトリクスも表示できる。
一部カスタマイズしたい部分があったのだが、Grafana のサーバ処理は Go で書かれている。
これを機会に Go の基本を学ぶと共に AWS SDK for Go の使い方の勉強用にいろいろ触ってみる。
※ Go の基本的な使用方法など Go言語 に書く事として、こちらの記事では主に AWS SDK for Go の使用方法などを記載していく事にする。

目次

Goのインストール

Homebrew でのインストール

brew install go

/.bash_profile

export GOPATH=/usr/local/opt/go/libexec
export PATH=$PATH:$GOPATH/bin

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

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 
}
TODO:

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