🎃
Go で実装したコードを AWS CloudShell を使って意識を低く実行する
これは何?
- Go で実装したコードを AWS CloudShell で実行する手順メモ
- ちょっとしたコードを実行したい時に便利かもしれない
- AWS SDK for Go を使ったちょっとしたスクリプトとか
- ローカル環境とは異なる IP アドレスから実行したい処理とか
- Pros
- サクッと実行できる
- マネジメントコンソールを使用する IAM ユーザーまたは IAM ロールのクレデンシャルが使える
- AWS Single Sign-On 等で SSO 環境を構築して複数の AWS アカウントを管理しているような場合など、特定の AWS アカウントや特定のリージョンに対してちょっとした処理するのに便利
- 無料で使える
- Cons
- HTTP リクエストを受け付けるサーバーのような使い方は現状できない
- AWS CloudShell 環境での操作内容やコードを実行したログが残らない
大まかな手順
- Go でコードを書く
- Amazon Linux 2 向けにバイナリをビルドする
- AWS CloudShell を立ち上げる
- AWS CloudShell にバイナリをアップロードする
- 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 向けにバイナリをビルドする
- AWS CloudShell の環境は Amazon Linux 2 なので、 Linux 向けにバイナリをビルドする
GOOS=linux GOARCH=amd64 go build main.go
AWS CloudShell を立ち上げる
-
ドキュメントに書いてあるとおり、以下の2つの方法がある
- マネジメントコンソールのナビゲーションバー右側にある AWS CloudShell アイコンをクリック
- マネジメントコンソールのナビゲーションバーにあるサービス検索ボックスに "cloudshell" と打ち込む
AWS CloudShell にバイナリをアップロードする
-
ドキュメントに書いてあるとおり、以下のような手順でアップロードできる
- AWS CloudShell 右上にある
Actions ▼
をクリックしてUpload file
を選択 - ローカル環境のアップロードしたいファイルを選択
- 今回の場合
main
ファイル
- 今回の場合
-
Upload
をクリック
- AWS CloudShell 右上にある
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