AWS SDK for GoとIAMRoleを活用してLinux/Windows両対応のスクリプトを作成する

AWS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Goを使ってみた

AWS SDKでGoが使えるようになったということで、すもけのブログを読んでみました。簡単そうですね!しかも、コンパイルしたらLinux/Mac/Windows用の実行ファイルにしてくれるという神仕様です。そこで、業務利用に適応できるか確認したいと思います。

AWS SDK for Go ファーストインプレッション

IAMRoleを使おう

EC2を業務利用しようと思ったらクレデンシャル情報のベタ書きはリスクが高いです。そこで、EC2インスタンスにIAMロールを設定することになります。GoでもIAMRoleが使えるのか試してみました。

Amazon LinuxにGoのインストール

最も簡単な方法でセットアップします。AWS SDK for Goもセットアップ。

$ sudo yum -y install golang
$ mkdir go
$ echo 'export GOPATH=$HOME/go' >> ~/.bash_profile
$ echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bash_profile
$ source ~/.bash_profile
$ go get github.com/awslabs/aws-sdk-go/gen/ec2

IAMRoleを使った動作確認

作ってみました。まず、クレデンシャル情報をベタ書きしている部分をaws.IAMCreds()に置き換えました。次に、リージョン文字列をAZ情報から動的に生成しました。これにより、どのリージョンで実行しても自分のIAMRoleから実行することができます。

ファイル名をrole.goとました。

package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
  "github.com/awslabs/aws-sdk-go/aws"
  "github.com/awslabs/aws-sdk-go/gen/ec2"
)

func main() {

  creds := aws.IAMCreds()
  cli := ec2.New(creds,getRegion(),nil)
  resp, err := cli.DescribeInstances(nil)
  if err != nil {
    panic(err)
  }

  if len(resp.Reservations) < 1 {
    return
  }

  for i := range resp.Reservations {
    fmt.Print(i)
    fmt.Print(" , ")
    fmt.Print(*resp.Reservations[i].Instances[0].VPCID)
    fmt.Print(" , ")
    fmt.Print(*resp.Reservations[i].Instances[0].SubnetID)
    fmt.Print(" , ")
    fmt.Print(*resp.Reservations[i].Instances[0].InstanceID)
    fmt.Print(" , ")
    fmt.Print(*resp.Reservations[i].Instances[0].InstanceType)
    fmt.Print(" , ")
    fmt.Println(*resp.Reservations[i].Instances[0].ImageID)
  }
}

func getRegion()(string){
  url := "http://169.254.169.254/latest/meta-data//placement/availability-zone"
  r,_ := http.Get(url)
  defer r.Body.Close()
  byteArray, _ := ioutil.ReadAll(r.Body)
  str := string(byteArray)
  size := len(str)
  return str[0:size-1]
}

実行結果です。

$ go build role.go
$ ./role
0 , vpc-5a9fXXXX , subnet-c47dXXXX , i-0f40XXXX , t2.micro , ami-1886XXXX
1 , vpc-5a9fXXXX , subnet-c47dXXXX , i-e057XXXX , t2.micro , ami-3507XXXX
2 , vpc-5a9fXXXX , subnet-c47dXXXX , i-8272XXXX , t2.micro , ami-4e58XXXX

いい感じに実行できました。これでクレデンシャル情報のベタ書きは不要となります。

GoといえばWindowsもやってみよう

Go言語は簡単にマルチプラットフォームで動くというので早速Windowsに入れてみよう。まずはGo言語をmsiでインストールして、Gitもインストールした。

環境変数は以下のような感じで、続けてAWS SDK for Goをインストール

C:\Users\Administrator\Documents>set GOPATH=C:\Users\Administrator\Documents\go
C:\Users\Administrator\Documents>go get github.com/awslabs/aws-sdk-go/gen/ec2

同じようにrole.goを作成してコンパイルして実行

C:\Users\Administrator\Documents>go build ./role.go
C:\Users\Administrator\Documents>role.exe
0 , vpc-5a9fXXXX , subnet-c47dXXXX , i-0f40XXXX , t2.micro , ami-1886XXXX
1 , vpc-5a9fXXXX , subnet-c47dXXXX , i-e057XXXX , t2.micro , ami-3507XXXX
2 , vpc-5a9fXXXX , subnet-c47dXXXX , i-8272XXXX , t2.micro , ami-4e58XXXX

すごい簡単です。。。exeを配布してもクレデンシャル情報は動的に取得されるので心配ありません。ちなみに、exeを生成したあとに、GoやGitをアンインストールしてみましたが、exeの実行には影響ありませんでした。全リージョン対応で置くだけです。

まとめ

これは簡単すぎるよっ!今回の実験によって、AWS SDK for Goを使い、LinuxとWindowsの両方で動くプログラムの動作確認をし、IAMRoleを使ってクレデンシャル情報をベタ書きせずにAWSのAPIにアクセスできることが分かりました。CloudWatchのカスタムメトリクスとか運用スクリプトはGoでいいんじゃないかな?

みなさん、Goですよ!