はじめに
AWSで環境構築・検証を行う上でほぼ必須となるIAMの基本的な知識について、個人的に色々と悩まされたので備忘録です。
初めてAWSやIAMを利用する方への参考になれば嬉しいです。
前編もあります。
IAMユーザとロールの違い(続)
前回のおさらい。
まず、IAMユーザは、「AWS内のリソースへのアクセス権を作業者(人、OSアカウント、AWS外の社内サーバなど)に付与する場合に使用する」という説明でした。
つまり、作業者AのIAMユーザに「"test"というVPC内のEC2インスタンスの起動・停止」のポリシーしか付与されていない場合、作業者Aはポリシー適用範囲外の作業
("test"VPC外のEC2インスタンスへのアクセス、同VPC内のLambdaファンクションの実行など)を
行う事ができない、という事になります。
このことから、IAMユーザに割り当てられるポリシーは、粒度にもよりますが基本的には「リソース単位」である事がわかります。
しかしシステムはそう単純に構築できない場合も多く、
「S3に特定のファイルがアップロードされたら、S3がLambdaファンクションをキックしてRDSへクエリを発行する」
などといった仕組みを実装したい場合があります。
しかしIAMユーザをLambdaファンクションに割り当てることはできません。
ここで登場するのが**"IAMロール"**の概念です。
IAMロール
一言で言えば、IAMロールは「サービスに割り当てて使用する」ものになります。
実際にはIAMロールに基づきSecurity Token Service(STS)が一時的な認証情報を払い出す作業などが発生しています。
上図を元に説明します。
ここでは適切なポリシーが割り当てられたIAMユーザによって、
S3に「.csv形式のファイルがアップロードされたら、指定されたLambdaファンクションを実行する」というイベント、
Lambdaに**「rds:*(RDSインスタンスへのフルアクセス)」を許可するポリシーが割り当てられたロール**
がそれぞれ割り当てられています。
それらを踏まえると、図の流れは以下のようになります。
- 作業者(VPCの内側、外側どちらでもOK)からS3に対し何らかのファイルがアップロードされる。
- S3設定されたイベントにより、アップロードされたファイルの拡張子が".csv"であれば、特定のLambdaファンクションを実行する(①)
- 呼び出されたLambdaファンクションが、アタッチされたロールに紐付くポリシーの権限により、RDSへクエリを発行する(②)
これにより、S3内にCSVファイルがアップロードされた際、ユーザの操作を介さずにLambdaファンクションが実行され、RDSにクエリを発行する
という操作が可能になります。
WebコンソールなどからLambda関数を実行する際、あらかじめIAMユーザやルートユーザでマネジメントコンソールにログインし、
適切な操作を行い実行します。その場合Lambda関数を実行しているのはあくまで何らかの"ユーザ"であり、そこには人間の操作が介在します。
しかし、"権限を委譲する"という概念の元、IAMロールに適切なポリシーを設定した状態でLambda関数と紐づけてやれば、
人間の操作を不要とする一連の流れが実行可能となるわけです。
プリンシパル
ここまで理解できると、ある疑問が出て来る方もいるでしょう。
「ロールが紐づいているのはLambdaなのに、どうしてS3がLambda関数を呼び出せる(実行できる)の?」
そこでプリンシパルの登場です。
プリンシパルはWebコンソール(IAM)のロールの詳細ページ、「信頼関係」タブにて設定できます。
該当のタブを選択すると、「ロールと、ロールのアクセス条件を引き受けることができる信頼されたエンティティを表示できます。」と記されています。
つまり、「ロールの持つ権限を委譲されたエンティティ(サービス)」をプリンシパルと呼びます。
(プリンシパルにはS3のみが登録されており、EC2は登録されていない。
そのためEC2にはロールのポリシーを委譲することができず、この場合はEC2からLambdaを実行できない)
まとめ
EC2やLambdaファンクションから、RDSなど他のAWSサービスにアクセスする際、本来であればアカウントのアクセスキーおよびシークレットキー(以下、認証情報)を渡す必要がありますが、
その場合、環境変数に認証情報を記載したり、プログラム内に認証情報を含める事になると思いますが、セキュリティ上好ましい手段とは言えません。
IAMロールをアタッチしたインスタンス(またはファンクション)であれば先述のSTSが認証情報の受け渡しをよしなに行ってくれるので、
認証情報の管理に関わるコストを低くする事ができます。
便利ですね!!
IAM!!
補足、用語解説
IAM
AWS Identity and Access Managementの略。
AWSの各リソースへのアクセスを安全にコントロールするためのサービス。
STS
AWS Security Token Serviceの略。
一時的な認証情報を発行してくれるサービス。
ポリシー
AWSサービスやAWSリソースに対する操作権限をJSON形式で定義したもの。大きく「AWS管理ポリシー」と「カスタマー管理ポリシー」の二つに分かれる。