AWS リソースへアクセスできないユーザーやサービスに、一時的にアクセスを委任する必要がある場面もあるかと思います。このようなシナリオでは、IAM ロールを使用することで、AWS リソースへのアクセスを委任することができます。 此度、IAMロールの機能についてCLIで軽く検証しました。AWSコンソールと違いますが、ロールを作る前に信頼される側を定義するため信頼ポリシーを用意しなければなりません。したがって、まず下記の信頼ポリシーjsonファイルを作ります。
$ vim trustPolicy.json
信頼される側Principalは ○ AWSサービス ○ 他のAWSアカウント ○ 他のサービル(例:Facebook,Google,Amazonなど) を指定できる。ここに詳しく紹介されていますが、実はPrincipalをARNで指定する場合、IAMグループやwildcard(*)(?)で設定することができない。nszwさんのブログのおっしゃるとおり、S3バケットや一時的権限をグループとして統一運用管理したい人達に対して、こいう仕様は罠と言っても過ぎないだと思います。 今回は信頼される側を別のAWSアカウントのユーザーにします。信頼ポリシーを指定した後、ロールを作成する。
$ export ROLENAME=iam-role-developers $ aws iam create-role --role-name $ROLENAME --assume-role-policy-document file://./trustPolicy.json
そして、ロールのポリシーファイルを作って権限を定義する。下記でS3を読取権限で指定する。
$ vim s3readonly.json
$ export ROLEPOLNAME=s3ReadOnlyPolicy $ aws iam put-role-policy --role-name $ROL1NAME --policy-name $ROLEPOLNAME --policy-document file://./s3readonly.json $ aws iam get-role-policy --role-name $ROLENAME --policy-name $ROLEPOLNAME
ここまで、ロールを作成しました。 ロール情報をインスタンスの開始時に Amazon EC2 インスタンスに渡すために、インスタンスプロファイルを使用する。下記コマンドでインスタンスプロファイルを作ってIAMロールに連携する。
$ aws iam create-instance-profile --instance-profile-name $ROLENAME $ aws iam add-role-to-instance-profile --instance-profile-name $ROLENAME --role-name $ROLENAME
ロールを引き受けるには、ユーザー(またはユーザーが実行するアプリケーション)は、AWS STSのAPIを呼び出すので、STSコマンドで作成したロールを検証します。指定された別のAWSアカウントユーザの認証環境で下記STSコマンドを入力すると
$ aws sts assume-role --role-arn arn:aws:iam::ロールオーナーのAWSアカウント:role/iam-role-developers --role-session-name role-session-name-test
一時的認証を取れます。 そして、取得した認証情報を設定する。
$ export AWS_ACCESS_KEY_ID=ASIAI275FSBPWY74ZPKA $ export AWS_SECRET_ACCESS_KEY=8h5IkBqGuN9iGBUGHr5F0mu3zf9GuXb/2DolGnUj $ export AWS_SESSION_TOKEN=AQoDYXdzEEYakAKsWomvCt6a6l+kDOq7MXpfgfiMBfH8Jm+414sVmoVRFeX71JTPbffyZXMJwHCql4QkTT9lAHWR5y2YmDmNqKsGK3yErzMmWcT2U4xFl0A4wIcnnYsxm2wF86+vAdM+0R5dFpqqKlDXzZwxZHtwYVY+ScMCnBSv+LuEX0JrUOsmyvas2M1DdnFWAPirrPq5QG4hxf9HiTggPRIP5DqCsIM6u8kgynRJM/PUV8G6yuBmhpM6iyIF6c1jAYvg42SQH268n4dLnE7FHQ+kkgIDbdalIjj/5kIhtQ9RPYQywJRl3i1WKF110PTR77k4uJBJcWqyRgaA7XVhhqjh5YVjIEIkxBYgnBqRP77UqowKnbPAdyD+ruyjBQ==
Describeコマンドでインスタンス情報を取得してみます。
$ aws ec2 describe-instances
ロールポリシーにS3読取権限しか与えられないので、下記エアーが出てきます。 S3バケット情報をlsコマンドで取得できました。