AWS CLIでAPIを使用するためにはアクセスキーの認証情報が必要になりますが、複数人で使う場合などはキー情報をみんなに伝えるのも面倒ですしセキュリティ上あまりよろしくないかと思います。また、全員に同じ権限が必要な訳でもないです。こういった場合はIAM Roleをインスタンスに割り当てればポリシーに準じた操作権限を与える事ができます。
IAM Roleを作成する
まずはインスタンスに割り当てるIAM Roleを作成します。マネジメントコンソールからIAM管理画面に移動します。
左のメニューにあるRolesを選択し、「Create New Role」ボタンをクリックします。
IAM Roleの名前を入力します。
IAM Roleの種類を選択します。今回はEC2インスタンスに割り当てるロールを作成するので、Amazon EC2 を選択します。
IAM Roleに適用するポリシーを選択します。今回はEC2のRead Only Accessを選択します。
選択したポリシーの内容が表示されます。これで問題なければ次へ。
最後に内容に誤りがなければ「Create Role」ボタンをクリックして終了です。
作成されました。
インスタンスにIAM Roleを割り当てる
IAM Roleはインスタンス作成時にしか割り当てられませんので新規作成から行ないます。インスタンスの作成については以下参照。
【AWS】EC2インスタンスの作成とSSH接続について - TASK NOTES
IAM Roleは「Step 3: Configure Instance Details」で指定します。
IAM Roleを指定した状態でインスタンスを作成すると、適用したポリシーでAPIにアクセスできるようになります。
インスタンスからAWS CLIを使う
それでは作成したインスタンスにSSHログインしてAWS CLIを使ってみます。
__| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/ 18 package(s) needed for security, out of 42 available Run "sudo yum update" to apply all updates. [ec2-user@ip-172-31-9-12 ~]$
aws configure でアクセスキーなど認証情報の設定は何もしていませんが、インスタンス情報の取得することができました。
$ aws ec2 describe-instances --region ap-northeast-1 --output text --query Reservations[].Instances[].InstanceId i-58a214bb i-a56631dc
今回適用しているポリシーはEC2の読み取り専用ですので、インスタンスを作成しようとするとエラーになります。
$ aws ec2 run-instances --image-id ami-4985b048 --instance-type t2.micro --region ap-northeast-1 --output json A client error (UnauthorizedOperation) occurred when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message:
また、IAM Roleを何も指定してないインスタンスの場合は次のように認証情報の設定を求められます。
$ aws ec2 describe-instances Unable to locate credentials. You can configure credentials by running "aws configure".
IAM Roleのポリシーを変更する
IAM Roleはインスタンスの作成時にしか割り当てられませんが、ポリシーを変更することは出来ます。
Manage Policyからポリシーを書き換えるか、
Attach Role Policyからポリシーを追加します。
これで先程できなかったインスタンスの作成ができるようになりました。
$ aws ec2 run-instances --image-id ami-4985b048 --instance-type t2.micro --region ap-northeast-1 --output json { "OwnerId": "510419843452", "ReservationId": "r-725c174f", "Groups": [], "Instances": [ { "Monitoring": { "State": "disabled" }, ... }