aws-sdk-goで指定したProfileのCredentialを利用しアクセスを行う


aws-sdk-go 正式版は Coming Soonです。

※ aws-sdkの開発が進み、当初記載していた方法ではアクセスできなくなってしまったので、新しい方法に更新しました。

前提条件

~/.aws/credentials
にProfileに紐づくID,Secret情報が設定されているとします。
(credentialファイル指定はメソッドの引数で行えますが、ここではデフォルト設定の上記ファイルとします)

~/.aws/credentials
[test]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYY

方法

NewSharedCredentials を利用します。

aws-sdk-goのNewSharedCredentialsメソッド(GoDoc)

cred, _ := credentials.NewSharedCredentials("", profile_name)
svc := ec2.New(&aws.Config{Credentials: cred, Region: "ap-northeast-1"})

サンプルコード

上記を用いて利用するProfile指定し、
任意のNameタグでフィルターしたDescriveInstancesのうち、Nameタグ、InstanceID、 Status を返すスクリプトを作ってみました。
以下のような感じです。(※エラー処理はしてません。。)

gist

descrive_ec2_instances.go

package main

import (
    "fmt"
    "github.com/awslabs/aws-sdk-go/aws"
    "github.com/awslabs/aws-sdk-go/aws/credentials"
    "github.com/awslabs/aws-sdk-go/service/ec2"
)

func main() {
    profile := "test" // your profile name
    name := "*test*"     // search string (NameTag)

    svc := ec2.New(&aws.Config{
        Credentials: credentials.NewSharedCredentials("", profile),
        Region:      "ap-northeast-1",
    })

    params := &ec2.DescribeInstancesInput{
        Filters: []*ec2.Filter{
            &ec2.Filter{
                Name: aws.String("tag:Name"),
                Values: []*string{
                    aws.String(name),
                },
            },
        },
    }

    res, _ := svc.DescribeInstances(params)

    for _, i := range res.Reservations[0].Instances {
        var nt string
        for _, t := range i.Tags {
            if *t.Key == "Name" {
                nt = *t.Value
                break
            }
        }
        fmt.Println(nt, *i.InstanceID, *i.State.Name)
    }
}

実行するとちゃんと指定したProfileのCredentialで動いています。

aws-sdk-go 待ち遠しいですね!