🎃

Go で実装したコードを AWS CloudShell を使って意識を低く実行する

2021/01/11に公開

これは何?

大まかな手順

  1. Go でコードを書く
  2. Amazon Linux 2 向けにバイナリをビルドする
  3. AWS CloudShell を立ち上げる
  4. AWS CloudShell にバイナリをアップロードする
  5. AWS CloudShell でバイナリを実行する

実際に試してみる

Go でコードを書く

  • STS の GetCallerIdentity API を使って、プログラムを実行している IAM ユーザーまたは IAM ロールの ARN や AWS アカウント ID を確認するコード
main.go
package main

import (
	"fmt"

	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/sts"
)

func main() {
	sess := session.Must(session.NewSessionWithOptions(session.Options{
		SharedConfigState: session.SharedConfigEnable,
	}))

	svc := sts.New(sess)

	resultGetCallerIdentity, err := svc.GetCallerIdentity(nil)
	if err != nil {
		fmt.Println("Error", err)
		return
	}

	fmt.Println(resultGetCallerIdentity)
}

Amazon Linux 2 向けにバイナリをビルドする

GOOS=linux GOARCH=amd64 go build main.go

AWS CloudShell を立ち上げる

launch_options

  • ドキュメントに書いてあるとおり、以下の2つの方法がある
    1. マネジメントコンソールのナビゲーションバー右側にある AWS CloudShell アイコンをクリック
    2. マネジメントコンソールのナビゲーションバーにあるサービス検索ボックスに "cloudshell" と打ち込む

AWS CloudShell にバイナリをアップロードする

upload-file

  • ドキュメントに書いてあるとおり、以下のような手順でアップロードできる
    1. AWS CloudShell 右上にある Actions ▼ をクリックして Upload file を選択
    2. ローカル環境のアップロードしたいファイルを選択
      • 今回の場合 main ファイル
    3. Upload をクリック

AWS CloudShell でバイナリを実行する

  • アップロードしたファイルには実行権限が付与されていないので chmod コマンドで実行権限を設定し、バイナリを実行する
chmod 744 main
./main
実行結果例
[cloudshell-user@ip-10-0-111-62 ~]$ pwd
/home/cloudshell-user
[cloudshell-user@ip-10-0-111-62 ~]$ ls -lh
total 9.8M
-rw-rw-r-- 1 cloudshell-user cloudshell-user 9.8M Jan 10 21:48 main
[cloudshell-user@ip-10-0-111-62 ~]$ chmod 744 main
[cloudshell-user@ip-10-0-111-62 ~]$ ls -lh
total 9.8M
-rwxr--r-- 1 cloudshell-user cloudshell-user 9.8M Jan 10 21:48 main
[cloudshell-user@ip-10-0-111-62 ~]$ ./main
{
  Account: "123456789012",
  Arn: "arn:aws:sts::123456789012:assumed-role/...",
  UserId: "XXX:..."
}

ノート

  • AWS CloudShell 環境には Node.js や Python も含まれているものの、ローカルで書いたコードでサードパーティライブラリを使用する場合、それらのファイルを含めたアップロードが必要となり面倒
    • なので Go でビルドしたシングルバイナリなら相性が良いかなーというアイディア
  • AWS CloudShell 環境のスペックは 1vCPU, 2 GiB RAM
  • AWS CloudShell におけるストレージは、 $HOME ディレクトリのみ永続化され、容量はリージョン毎に 1GB と決まっているので注意
    • まぁそもそも 1GB を超えるようなバイナリになるコードになる場合、もっとちゃんとした方法で動かしたほうが良いかも
    • Go でビルドしたバイナリは、数 MB から数十 MB 程度のサイズに平気でなるので、実行後に後片付けはしておいたほうが良いかも

Discussion