AWS SDK for GoとIAMRoleを活用してLinux/Windows両対応のスクリプトを作成する
Goを使ってみた
AWS SDKでGoが使えるようになったということで、すもけのブログを読んでみました。簡単そうですね!しかも、コンパイルしたらLinux/Mac/Windows用の実行ファイルにしてくれるという神仕様です。そこで、業務利用に適応できるか確認したいと思います。
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ですよ!