はじめに
本格的に AWS の運用を行いたい場合、開発用 / 本番用 AWS アカウントなど、異なる用途の複数 AWS アカウントを使い分ける事が多いかと思います。
開発者が操作したい AWS アカウントを切り替えるとき、マネジメントコンソールでは一般的に IAM ロールの切り替えを行います。AWS CLI や AWS SDK を利用したプログラムでは、AWS STS で一時的なセキュリティ認証情報のリクエストを行う必要があります。
今回は AWS SDK for Go を使用して、一時的な認証情報を取得する方法を紹介します。
環境
- macOS Mojave 10.14.3
- go version go1.9.4 darwin/amd64
- aws-sdk-go: Release v1.16.29
事前準備
- 開発用/本番用などの AWS アカウントを 2 つ以上用意する。
- 開発用アカウントの IAM ユーザーのクレデンシャルを
aws configure
コマンドから設定する。(~/.aws/credentials
が存在すること。)- 開発用アカウントの IAM ユーザーには
sts:AssumeRole
のポリシーが許可されている状態にする。
- 開発用アカウントの IAM ユーザーには
- 本番用アカウントの IAM ロールを任意の権限で作成し、
Principal
句で開発用アカウントおよび IAM ユーザーからアクセスできる状態にする。
サンプルコード
以下は AWS STS の AssumeRole を使用して、異なる AWS アカウントの EC2 インスタンス情報を取得するサンプルコードです。
コード中の profile
, region
, roleArn
変数はご利用の環境に合わせて変更してください。
main.go
package main
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/credentials/stscreds"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
)
var (
profile = "default"
region = "ap-northeast-1"
// FIXME: Rewrite your AWS Account ID and IAM Role Name.
roleArn = "arn:aws:iam::<123456789012>:role/<Your-Role-Name>"
)
// AssumeRoleWithSession returns switched role session from argument session and IAM role's arn in same region.
func AssumeRoleWithSession(sess *session.Session, rolearn string) *session.Session {
sCreds := stscreds.NewCredentials(sess, rolearn)
sConfig := aws.Config{Region: sess.Config.Region, Credentials: sCreds}
sSess := session.New(&sConfig)
return sSess
}
func main() {
// Get credentials from default(~/.aws/credentials) path.
// 開発環境などで使用している認証情報を取得する。
creds := credentials.NewSharedCredentials("", profile)
config := aws.Config{Region: aws.String(region), Credentials: creds}
dSess := session.New(&config)
// Get the Switched Role Session.
// 本番環境など、開発環境で使用している認証情報を取得する。
sSess := AssumeRoleWithSession(dSess, roleArn)
// Example: Get EC2 info using the switched session.
// 開発環境の認証情報から、本番環境の EC2 情報などが(IAM ロールの権限で許可された範囲内で)取得できる。
result, _ := ec2.New(sSess).DescribeInstances(nil)
fmt.Println(result)
}
おわりに
筆者が検証した際に、AWS SDK for Go での AssumeRole の日本語記事がさっと見つからなかったので記事にしました。
どなたかのお役に立てば幸いです。