はじめに
マルチアカウント運用でAssumeRoleするかつ、MFA入力必須な場合、awscli等の操作も含めてややこしいですよね。awscliはともかく、AWS SDK for Goを使った上記の例が少いように見受けられたので残しておきます。
結論
MFAとAssume IAM Roles を使って環境でAWS SDKをGoで操作する方法は...
-
AssumeRoleTokenProvider
を用います - MFAトークンを標準入力する場合は
stscreds.StdinTokenProvider
を利用すると良いです- そうすると、下記のような入力を求められるようになります
コード
例として、LambdaのCloudWatchLogsのLogStreamを検索するコードです。
AssumeRoleしつつMFAを利用する場合
func main() {
var (
logGroup = "/aws/lambda/<YourAppName>"
logStreamPrefix = "2020/04/01" // 適当な日付
)
svc := cloudwatchlogs.New(
session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
AssumeRoleTokenProvider: stscreds.StdinTokenProvider, // MFAのときは必須
})),
&aws.Config{
Region: aws.String(os.Getenv("AWS_REGION")),
},
)
stm, err := svc.DescribeLogStreamsWithContext(ctx, &cloudwatchlogs.DescribeLogStreamsInput{
LogGroupName: aws.String(logGroup),
LogStreamNamePrefix: aws.String(logStreamPrefix),
NextToken: nil,
})
if err != nil {
log.Fatal(err)
}
for _, v := range stm.LogStreams {
fmt.Println(aws.StringValue(v.LogStreamName), aws.Int64Value(v.CreationTime))
}
}
MFAトークンを正しく入力さえできれば、ログストリームの一覧を取得できたと思います。
参考