Go言語でAWS EC2インスタンスを制御してみた

AWS EC2インスタンスをいじる際、AWSコンソールを使うことが多いかと思います。
しかし、起動中/停止中の確認や、起動/停止をするためだけにAWSコンソールにアクセスするのもそれはそれで手間がかかります。

AWS CLIを使えばコマンドで上記のことができます。
また、各プログラミング言語に対応したAWS SDKを使うことでそれぞれの言語でツールを作成することもできます。

今回「AWS SDK for Go V2」を使ってGo言語でコマンドラインツールを作ったので紹介したいと思います。

公式のDeveloper Guideはこちらになります。

AWS SDK for Go V2

The AWS SDK for Go V2 provides APIs and utilities that devel…

前提条件

  • EC2に関する権限を持つIAMユーザーを作成済みであること
  • 上記IAMユーザーのアクセスキー及びシークレットキーを取得済みであること
  • AWSに関する基本的な知識を有していること

作成したコマンドラインツールの概要

  • 当該AWSアカウントが持っているEC2インスタンスの「Reservation ID」「Instance ID」「状態」の表示
  • 当該EC2インスタンスの起動
  • 当該EC2インスタンスの停止

上記の機能を有するコマンドラインツールをGo言語で作成しました。

Go言語でEC2インスタンスをあれこれする公式サンプルコードはこちらになります。

AWS SDK for Go V2

The AWS SDK for Go V2 provides APIs and utilities that devel…

こちらを参考に作成しました。

公式サンプルコードとの違い

公式サンプルコードはIAMユーザーの認証情報を「~/.aws」配下のファイルから取得しています。
「~/.aws」にファイルがない場合を考慮して、環境変数に各種情報をセットして「Credentials Provider」を新たに生成するようにしました。

func setupConfig(clientKey string, clientSecret string, clientRegion string) (aws.Config, error) {
    appCredentials := aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(clientKey, clientSecret, ""))

    return config.LoadDefaultConfig(context.TODO(),
        config.WithCredentialsProvider(appCredentials),
        config.WithRegion(clientRegion),
    )
}

clientKeyはアクセスキー、ClientSecretはシークレットキー、clientRegionはリージョンになります。
(これらは環境変数にセットされている前提です)

EC2インスタンスの起動及び停止の際のDryRunパラメータですが、サンプルコードだと「true」もしくは「false」を設定しています。
しかし「ec2.StartInstancesInput」の定義を見ると「*bool」になっています。
そのため、予め変数にbool値を入れておき、その変数のアドレスを渡すように修正しました。

dryRun := true
client := ec2.NewFromConfig(config)
input := &ec2.StartInstancesInput{
    InstanceIds: []string{
        instanceId,
    },
    DryRun: &dryRun,
}

コマンド実行結果

インスタンス起動

>./hogehoge -start -id {インスタンスID}
User has permission to start an instance.
Started instance with ID i-xxxxxxxxxxxxxxxxx

起動後の状態確認

>./hogehoge -id {インスタンスID}
Reservation ID: r-xxxxxxxxxxxxxxxxx
Instance IDs:
i-xxxxxxxxxxxxxxxxx: running

インスタンス停止

>./hogehoge -stop -id {インスタンスID}
User has permission to stop instances.
Stopped instance with ID i-xxxxxxxxxxxxxxxxx

停止後の状態確認

>./hogehoge -id {インスタンスID}
Reservation ID: r-xxxxxxxxxxxxxxxxx
Instance IDs:
i-xxxxxxxxxxxxxxxxx: stopped

まとめ

ドキュメントがあまり充実していないのでSDKのソースコードを見たりして実装しました。
(私の探し方が下手なだけかもしれませんが…)

環境変数から認証情報を設定するあたりは意外と参考になるのではないかと自負しています。

この記事がGo言語でAWS SDKを使おうと思っている方の参考になれば幸いです。