先日、GoでAWSを動かすと早いと言う話をしました。
その際にGoでは最初に認証を行っているのに対して、AWS CLIは都度認証を行っているから早いのではないか?と結論付けました。
その仮説が本当に正しいのかを確かめてみました。
確認用に作成したのは以下のスクリプトです。
ファイル名:aws_time2.go
package main import ( "fmt" "strings" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/iam" ) const ( debug = false loop = 100000000 ) func main() { svc := iam.New(session.New(), &aws.Config{}) users, err := svc.ListUsers(nil) if err != nil { panic(err) } t1 := time.Now() for count := 0; count < loop; count++ { for i := 0; i < len(users.Users); i++ { if strings.Index(*(users.Users[i].UserName), "TestUser") > 0 { attachUserPolicyInput := &iam.AttachUserPolicyInput{ PolicyArn: aws.String("arn:aws:iam::<アカウントID>:policy/AmazonIAM-ReadOnly"), UserName: aws.String(*(users.Users[i].UserName)), } svc = iam.New(session.New(), &aws.Config{}) _, err = svc.AttachUserPolicy(attachUserPolicyInput) if err != nil { panic(err) } detachUserPolicyInput := &iam.DetachUserPolicyInput{ PolicyArn: aws.String("arn:aws:iam::<アカウントID>:policy/AmazonIAM-ReadOnly"), UserName: aws.String(*(users.Users[i].UserName)), } svc = iam.New(session.New(), &aws.Config{}) _, err = svc.DetachUserPolicy(detachUserPolicyInput) if err != nil { panic(err) } } } } t2 := time.Now() fmt.Println(t2.Sub(t1)) }
変更点としてはAttachUserPolicyとDetachUserPolicyの前にiam.Newを呼んでいる点です。
ここでセッションを新しく張り直すのでその分時間がかかるはず。
・・・で、時間の計測をしてみた結果ですが、変更前とあまり変わりませんでした。
1,000,000回のループで0.16秒、100,000,000回のループで15.22秒とほぼ同じ。
結論:GoはGoだから早い。
本当にGo自体が早いのか、認証は実は別の箇所で行っているのか、あるいは何らかの最適化で省略されているのか。
う~ん、なんだか腑に落ちない結論だなぁ。
そんなわけで、今日はこれまで。
それでは、ごきげんよう。