雑記

インフラのことだったりプログラムのことだったりどうでもいいこと書いたり。要は雑記。

AWS SDK for GOを使ってRoute53のレコードを取得する

タイトル通り、サンプル作ってみました

環境

% go version
go version go1.4.2 darwin/amd64

準備

  • パッケージの取得
% go get -u github.com/aws/aws-sdk-go/
% go get -u github.com/vaughan0/go-ini

go-iniはaws-sdk-goのcredentialsで使ってるらしく、いれていないと以下のエラーがでる

../../../../.golocal/src/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go:8:2: cannot find package "github.com/vaughan0/go-ini" in any of:
        /usr/local/Cellar/go/1.4.2/libexec/src/github.com/vaughan0/go-ini (from $GOROOT)
        /Users/ogawa-masaki/.golocal/src/github.com/vaughan0/go-ini (from $GOPATH)
  • クレデンシャルの設定
% cat ~/.aws/credentials
[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

サンプル

登録しているレコード情報を表示するだけです。

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/service/route53"
)

func main() {
    domain := "example.internal."

    client := route53.New(&aws.Config{})

    // domainからHostedZoneIDの取得
    hzresp, err := client.ListHostedZonesByName(&route53.ListHostedZonesByNameInput{DNSName: aws.String(domain),})
    if err != nil {
        panic(err)
    }
    HostedZoneID := hzresp.HostedZones[0].ID

    // ResourceRecordSetsを取得
    rrsresp, err := client.ListResourceRecordSets(&route53.ListResourceRecordSetsInput{HostedZoneID: HostedZoneID})
    if err != nil {
        panic(err)
    }

    // 出力
    for i := range rrsresp.ResourceRecordSets {
        fmt.Println(awsutil.StringValue(*rrsresp.ResourceRecordSets[i]))
    }
}

AWS SDK for GOもついにPreview版となりましたし、どんどん活用していきたいですね。

go langことはじめ

ちょっとgoさわってみたくなった

インストール

Macなのでhomebewで

% brew install go

ちょーかんたん

PATHの設定

zshなので.zprofileで

if [ -x "`which go`" ]; then
    export GOROOT=`go env GOROOT`
    export GOPATH=$HOME/.golocal
    export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
fi

事前にmkdir ~/.golocalしてます

はろーごーらんぐ

定番

  • hello.go
package main

import "fmt"

func main() {
    fmt.Println("はろーごーらんぐ")
}

というか普通に日本語つかえた。

build

% go build hello.go

実行

% ./hello
はろーごーらんぐ

でけた。

ちなみに

なんでいきなりgoかというと、aws-goを使ってみたかったから。 AWS API使ったすごい簡単なものをpythonで作ったんだけど、ふとこれをgoで作ったらどんなんになるんだろと思って。

というわけでこれからaws-goで遊んでみます。

EC2のタグをCLIで管理するtapewriterというツールを作った

タイトル通りですが、EC2のタグをCLIで管理したくて(=コード化したくて)作ってみました。

route53をDSLで管理するroadworkerという素晴らしいツールがあるのですが、おもいっきりその影響を受けています。 (や、ほんと素晴らしいツールで結構な衝撃だったんです)

なにをするもの?

EC2のタグをjsonで管理できるようになるツールです。 jsonなのでバージョン管理もバックアップも取れます。

どんなところで使うの?

  • タグのバックアップをとりたいとき
  • タグをバージョン管理したいとき
  • ブラウザでの作業が嫌だというとき
  • タグを一気に変更したいとき

つかいかた

 タグをエクスポートする

% tapewriter -r ap-northeast-1 -f dev-app.json --export --filter '{"Env":"dev", "Role":"app"}' 

フィルターが使えます

タグを編集する

  • 変更前
{
  "instances": [
    {
      "id": "i-11111111",
      "region": "ap-northeast-1",
      "tags": {
        "Env": "dev",
        "Role": "app",
        "Name": "hoge",
        "State": "standby"
      }
    },
    {
      "id": "i-22222222",
      "region": "ap-northeast-1",
      "tags": {
        "Env": "dev",
        "Role": "app",
        "Name": "fuga",
        "State": "standby"
      }
    }
  ]
}
  • 変更後
{
  "instances": [
    {
      "id": "i-11111111",
      "region": "ap-northeast-1",
      "tags": {
        "Env": "dev",
        "Role": "app",
        "Name": "hoge",
        "State": "run"
      }
    },
    {
      "id": "i-22222222",
      "region": "ap-northeast-1",
      "tags": {
        "Env": "dev",
        "Role": "app",
        "Name": "fuga",
        "State": "run"
      }
    }
  ]
}

Stateタグを変更しています。

dry-run(テスト実行)

どんな変更がされるか確認

% tapewriter -r ap-northeast-1 -f dev-app.json --apply --dry-run

適用

タグを適用

% tapewriter -r ap-northeast-1 -f dev-app.json --apply

実際使ってみて

複数インスタンスのタグを一気に変更したいときにあってよかったなーと思いました。

でも1つのインスタンスのタグを一つだけ変える、とかだったらAWSコンソールからやったほうが早いです。

そもそも

みんなタグってどうやって管理しているんだろ。というかそもそも使ってないのか?ちょっと聞いてみたい。

sensuについてちょっとだけ発表した

資料は以下。

こういった発表は初めてだったんだけど、伝えたいこと全然言えなかった。 難しいものですね。

多分内容的にはニッチなものです。 最近では監視系はSaaSを利用するパターンが主流だと思うんだけど、お金とか事業や会社の方針でSaaSが使えないという方もいらっしゃるとは思うので、そういった方の参考になればなーと思います。

ちなみにdemo中で利用したものは以下です。

気がづいたらGrafanaの2.0(beta)がリリースされてた

ざっと見た感じ、結構変わってますね。

  1. グラフのスナップショットがとれるらしい -> 障害時にスナップしてチャットに送るとかできるのかな
  2. シングルパネルが表示できる -> 最新のロードアベレージとかパッと見てわかるようになる
  3. バックエンドをブラウザ上から複数保存 -> グラフにするときにどのバックエンドを利用するか選択可能
  4. グラフ毎に表示させる時間帯を変更可能に(これまでは1ページで同じ時間を表示させてた)
  5. Grafanaがデーモンとして起動するようになってる
  6. 各パッケージでインストールできるようになってる
  7. アカウント管理ができる -> ダッシュボード見るのにログインを挟むことができる(なしにもできそう)

それ以外にもUIがわりかし変わってました(でも大幅な変更でないので違和感はない)

上記だと1と2の機能がずっと欲しかったんで、早速いろいろ試したいと思います。