AWS SDK for Go でビルドしたバイナリをCentOS5で試してみた

2015.02.01

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

はじめに

AWSチームのすずきです。

GoogleよりOSSとして提供されている、シンプルで並列処理に強いプログラミング言語とされるGo。 先日、AWS SDK for Goがデベロッパープレビューとして公開され、弊社ブログでも紹介させて頂いています。

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

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

Go言語、ビルドにより1つのバイナリファイルが生成され、ライブラリを意識する事なく別環境に流用できる特徴があります。

今回、AmazonLinux上でビルドしたAWS SDK for Goを利用してEC2のAPIを実行するバイナリファイルを、 少し古めのOS環境(CentOS 5.10、Ubuntu 12.04)にコピーして、その実行可否を試してみました。

ビルド

OS情報

  • OS Amazon Linux 2014.09.2
  • AMI amzn-ami-hvm-2014.09.2.x86_64-ebs (ami-dfc39aef:us-west-2)

環境構築(Go)

Go go version go1.3.3 linux/amd64

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

go version

検証用ソース生成1

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

cat << EOF > test-ec2.go
package main
 
import (
  "fmt"
  "os"
 
  "github.com/awslabs/aws-sdk-go/aws"
  "github.com/awslabs/aws-sdk-go/gen/ec2"
)
 
func main() {
  accessKey     := os.Getenv("AWS_ACCESS_KEY_ID")
  secretKey     := os.Getenv("AWS_SECRET_ACCESS_KEY")
  defaultRegion := os.Getenv("AWS_DEFAULT_REGION")
 
  if accessKey == "" || secretKey == "" || defaultRegion == "" {
    fmt.Println("Error: Undefined AWS_ACCESS_KEY_ID or AWS_SECRET_ACCESS_KEY or AWS_DEFAULT_REGION")
    os.Exit(9)
  }
 
  creds := aws.Creds(accessKey, secretKey, "")
  cli := ec2.New(creds, defaultRegion, 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)
  }
}
EOF

検証用ソース生成2

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

cat << EOF > test-ec2-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]
}
EOF

ビルド

go build test-ec2.go 
go build test-ec2-role.go

実行検証

CentOS-5.10-x86_64

  • AMI Datapipe-CentOS-5.10-x86_64 (ami-fc640acc:us-west-2)

Ubuntu 12.04 LTS-x86_64

  • ubuntu-precise-12.04-amd64-server-20140927 (ami-07470537c:us-west-2)

共通

  • インスタンス:t1.micro
  • EC2ロール:EC2権限ロールを事前用意して、EC2インスタンスの起動時に付与する
  • IAMユーザ:EC2権限を有すIAMユーザを作成、アクセスキー、シークレットキーを用意する
  • Goバイナリファイル:ビルド環境で生成したファイルは、S3、SSH等を利用して事前に実行環境のローカルに転送し、実行権限を付与する
  • パッケージ:追加なし(AMI起動直後のままとする)

実行結果

CentOS-5.10-x86_64

  • AMI Datapipe-CentOS-5.10-x86_64 (ami-fc640acc:us-west-2)

OS情報確認

# cat /etc/redhat-release 
CentOS release 5.10 (Final)
# uname -a
Linux ip-172-31-21-211 2.6.18-371.4.1.el5xen #1 SMP Thu Jan 30 06:58:16 EST 2014 x86_64 x86_64 x86_64 GNU/Linux

サンプル1

$ export AWS_ACCESS_KEY_ID="aaaaaaaaaaaaaaaaaaaa"
$ export AWS_SECRET_ACCESS_KEY="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
$ export AWS_DEFAULT_REGION="us-west-2"

$ ./test-ec2
0 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-fc640acc
1 , vpc-00000000 , subnet-00000000 , i-00000000 , t2.micro , ami-dfc39aef
2 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-07470537

サンプル2

$ ./test-ec2-role
0 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-fc640acc
1 , vpc-00000000 , subnet-00000000 , i-00000000 , t2.micro , ami-dfc39aef
2 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-07470537

<h4>Ubuntu 12.04

<h5>OS情報確認

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.5 LTS"

$ uname -a
Linux ip-172-31-21-13 3.2.0-69-virtual #103-Ubuntu SMP Tue Sep 2 05:21:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

サンプル1

$ export AWS_ACCESS_KEY_ID="aaaaaaaaaaaaaaaaaaaa"
$ export AWS_SECRET_ACCESS_KEY="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
$ export AWS_DEFAULT_REGION="us-west-2"

$ ./test-ec2
0 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-fc640acc
1 , vpc-00000000 , subnet-00000000 , i-00000000 , t2.micro , ami-dfc39aef
2 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-07470537

サンプル2

$ ./test-ec2-role
0 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-fc640acc
1 , vpc-00000000 , subnet-00000000 , i-00000000 , t2.micro , ami-dfc39aef
2 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-07470537

まとめ

AmazonLinux上でビルドした、AWS SDK for Goを利用するバイナリファイル、 AWS SDKを始めとする開発環境を導入していない素のCentOS 5.10、Ubuntu 12.04でも実行する事ができました。

アプリの実行環境と干渉するなどの理由によりSDKやAWS CLIの導入が難しい事がありますが、 このような場合でも、AWSのAPIを実行する事が可能となる可能性のあるAWS SDK for Go。その正式リリースを心待ちにしたいと思います。