はじめに
何度やっても分からなくなる AssumeRole 様。
もう忘れないように、調べたことを記録として残します。
(これを機に、AssumeRole をマスターしたい!!!👺👺👺)
AssumeRole って?
ひとことで説明すると、権限を一時的に借りる 仕組みです。
assume は「~だと想定する」、「~を引き受ける」という意味なので
なんとなくイメージ出来るかなと思います。
もうちょっと詳しく 🪆
わたし は権限を借りたい主体
別の人 は権限を貸す側で、IAMロールには実行したい操作の権限(ポリシー)を設定します
AssumeRole するとは
わたし が一時的に、別の人 の権限を借りること
AssumeRole すれば
本来のわたし の権限では出来ないことも、別の人の権限に含まれていれば、
できるようになります(説明をすればするほど混乱する、、🌚)
なぜAssumeRole するの?
ひとことで説明すると、AWS へのアクセスを安全に管理するためです。
AssumeRole するときに払い出される権限は、一時的 に有効という点がポイントです。
永続的なアクセスキーは一度漏洩してしまうと、無制限に利用されるリスクがあります。
定期的に更新する事も出来ますが、これは運用の手間になります。
これらのリスクや運用の手間を解決するために必要です!
(最小権限の原則など、、まだまだあると思いますがここでは割愛😀)
整理すると
AssumeRole は
- 一時的に別の人の権限を引き受けること
- AssumeRole という特別なロールではない
- セキュリティ向上の目的で利用される
AssumeRole はどうやってやるの?
STS (AWS Security Token Service) というサービスを使います。
AWS リソースへのアクセスをコントロールできる一時的セキュリティ認証情報を持つ、信頼されたユーザーを作成および提供することができます。
IAM の一時的な認証情報
AssumeRole の流れ
- わたしが AssumeRole のリクエストをSTS に送る
- STS はわたし にAssumeRole して良いか確認
- 問題なければ、STS がわたし に一時的な認証情報を発行する
- わたし は一時的な認証をもって、AWS にアクセスする🐷
ホテルでのチェックインもざっくりと理解するには良い例かなと思います🏨
フロント(STS)でチェックイン(権限を確認)して、
ルームキー(一時的な認証情報)をもらい部屋に入る(アクセス)…
ざっくりと理解するには良い例かなと思います。
私の解釈を含みますが、大体は整理できました🌱
公式ドキュメント
ソースコード例
AWS S3 にAssumeRole でアクセスする際のS3 クライアントの一例です🏇
SDK を使用したAssumeRole の例はドキュメントで紹介されていますので、ご参考までに!
環境
- Java 8
- AWS SDK for Java v2
private static S3Client createS3Client(String accessKey, String secretKey, String region, String roleArn, String externalId) {
AwsBasicCredentials awsCreds = AwsBasicCredentials.create(accessKey, secretKey);
return S3Client.builder()
.region(software.amazon.awssdk.regions.Region.of(region))
.credentialsProvider(StsAssumeRoleCredentialsProvider.builder()
.stsClient(StsClient.builder()
.region(software.amazon.awssdk.regions.Region.of(region))
.credentialsProvider(StaticCredentialsProvider.create(awsCreds))
.build())
.refreshRequest(builder -> builder
.roleArn(roleArn)
.roleSessionName("xxx")
.externalId(externalId))
.build())
.build();
}
公式ドキュメント
おわり
こうして自分の言葉でアウトプットして、ざっくりとではありますが、
説明できるようになったので、もう忘れないはず!!!
ちょっとAIコーディングについて所感
AIコーディング時代のジュニアエンジニアとして、どう生成AIとうまく付き合っていくか考え、試行錯誤しています。ソースコードは簡単に作れるようになっても、その仕様をきちんと説明できるのか?どんな仕組みなのか、次に応用できるのか。AssumeRole のコードはかけても、AssumeRole について理解できていなかったら意味が無いと思います。
開発のなかで生まれる疑問は、その都度解決するようにしていますが、毎日何十回ものラリーをしているので、誰かを助けられるようなナレッジも流れていっているような気がします。
定期的に立ち止まり、自分の言葉で説明できるのか?という基準で振り返ること。
力試しの意味でもアウトプットをしてみること(きっと不安なところが出てくるはず…!)
AIコーディングの時代でも、アウトプットは大事だな~と実感させられました。
おしまい👺
