はじめに
EC2インスタンスにCLIからインスタンスプロファイルを割り当てる作業を行った際、ちゃんと理解できてないなぁと感じたので、覚えがてらインスタンスプロファイルとIAMポリシー、IAMロールの関係について整理します。
IAMポリシーとは
AWSのリソースにアクセスする際の制御を行う機能です。
IAMポリシーにはAWSが事前に用意しているAWS管理ポリシーとユーザがカスタマイズして使うカスタマー管理ポリシーがあります。
AWS管理ポリシーはAmazonS3ReadOnlyAccess
やAmazonEC2FullAccess
などの名前が付けられているため、利用するサービスへのアクセスに必要なポリシーを選んで各ユーザ、グループなどに割り当てることで各リソースへのアクセスを制限できます。
但し、AWS管理ポリシーを使う場合、ポリシーの編集はできないため、もし複数サービスへのアクセス許可を定義したポリシーを作成したかったり、サービスへのアクセス制御以外にIPアドレスでもアクセス制限したかったりする場合はカスタマー管理ポリシーを作成して、使いたいAWS管理ポリシーを選ぶことでユーザ独自のポリシーを作成することができます。
IAMロールとは
EC2インスタンスやLambdaなどからAWSの各種サービスを利用したい場合に、AWSサービスの操作権限を与える機能です。
ユーザがAWS CLIやAWSコンソールからAWSのサービス、リソースを操作する場合、アクセスキー、シークレットアクセスキーを使ってアクセスを行いますが、IAMポリシーをIAMロールにアタッチして、さらにアタッチしたIAMロールをEC2インスタンス等に紐付けることでアクセスキー、シークレットアクセスキーを設定しなくても、IAMポリシーで許可されているサービス、リソースを操作できます。
EC2インスタンスであれば、ユーザのアクセスキーをaws configure
コマンドで登録してあげれば、ユーザに紐付けられているポリシーで`AWS CLIでアクセスすることもできますが、アクセスキーを登録する必要が無い分セキュリティ的に安全で、アクセスキーの登録ができないLambdaやECSのコンテナ上からも利用できるのがメリットです。
インスタンスプロファイルとは
EC2インスタンスとIAMロールを結びつけるための箱です。
AWSコンソールから操作した場合にはインスタンスプロファイルなんて用語が出てきませんが、AWSコンソールからEC2インスタンスにIAMロールをアタッチするときにプルダウンで選択する名前がInstanceProfile
です。
内部的には、IAMロールはEC2インスタンスに直接結びつけることができず、InstanceProfile
経由でIAMロールを結びつけることでEC2インスタンスでIAMロールを使用できるようにしています。
ただ、AWSコンソールから操作した場合はIAMロールを選択することで、内部的に勝手にIAMロールと同じ名前でインスタンスプロファイルが作られて、IAMロールと結び付けられるので、インスタンスプロファイルという用語が出てこないわけです。
そのおかげでインスタンスプロファイルの概念を理解するのに記事一本書けてしまいました。
AWS CLIからのポリシー、ロール、インスタンスプロファイルの作成
IAMポリシー、IAMロール、インスタンスプロファイルの関係を理解するために、先ほどの図を少し修正した以下図を参考にAWS CLIから作っていこうと思います。
- IAMポリシーの作成
- IAMロールの作成
- IAMロールとIAMポリシーの紐付け
- インスタンスプロファイルの作成
- インスタンスプロファイルとIAMロールの紐付け
- インスタンスプロファイルとEC2インスタンスの紐付け
前準備
今回はEC2インスタンスからS3のinstance-profile-test1
というバケットに対しての書き込み権限を与えるインスタンスプロファイルを作成しようと思います。
今回出てくる名前やファイルは以下として進めます。
構成 | 設定 |
---|---|
IAMポリシー名 | S3WritePolicy |
IAMロール名 | S3WriteRole |
インスタンスプロファイル名 | S3WriteProfile |
IAMポリシーファイルパス | /home/ec2-user/iampolicy.json |
Assumeロールファイルパス | /home/ec2-user/assume.json |
テスト用S3バケット(許可あり) | instance-profile-test1 |
テスト用S3バケット(許可なし) | instance-profile-test2 |
書き込みテスト用ファイル | /home/ec2-user/writetest |
IAMポリシーの作成
IAMポリシー作成には以下のようなJSON
形式の設定ファイルが必要となります。
既に手元に雛形があれば手元のファイルから作成すれば良いですが、初めはIAMポリシー作成時に表示されるビジュアルエディタから作成したほうが良いかもしれません。
以下でinstance-profile-test1
というバケットに対する書き込み許可とリスト表示の許可設定を行っています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::instance-profile-test1/*",
"arn:aws:s3:::instance-profile-test1"
]
}
]
}
上記で作成したIAMポリシーファイルを使ってIAMポリシーを作成します。
また、後ほど使用するため、create-policy
実行後に表示されるArn
は控えて下さい。
aws iam create-policy --policy-name S3WritePolicy --policy-document file:///home/ec2-user/policy.json
{
"Policy": {
"PolicyName": "S3WritePolicy",
"PermissionsBoundaryUsageCount": 0,
"CreateDate": "YYYY-MM-DDThh:mm:ssZ",
"AttachmentCount": 0,
"IsAttachable": true,
"PolicyId": "xxxxxxxxxxxxxxxxxxxxx",
"DefaultVersionId": "v1",
"Path": "/",
"Arn": "arn:aws:iam::xxxxxxxxxxxx:policy/S3WritePolicy",
"UpdateDate": "YYYY-MM-DDThh:mm:ssZ"
}
}
IAMロールの作成
IAMロール作成には以下のようなJSON
形式のAssumeロールというファイルが必要となります。
Assumeロールとは、AWSコンソールでロールを作成する場合の信頼関係タブにあたる設定となり、うまく設定すると、他のアカウントからのアクセスなどを信頼することもできるそうです。
今回はIAMロール作成時のデフォルトで作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
}
}
]
}
上記で作成したIAMポリシーファイルを使ってIAMポリシーを作成します。
aws iam create-role --role-name S3WriteRole --assume-role-policy-document file:///home/ec2-user/assume.json
IAMロールとIAMポリシーの紐付け
先ほど個々に作成したIAMロールとIAMポリシーを紐付けします。
--policy-arn
で指定するARN
は、先ほどIAMポリシーを作成した際に表示されたARN名を指定してください。
aws iam attach-role-policy --role-name S3WriteRole --policy-arn arn:aws:iam::xxxxxxxxxxxx:policy/S3WritePolicy
もしARM名を控え忘れた場合は以下から確認しましょう。
aws iam list-policies --scope Local
インスタンスプロファイルの作成
EC2インスタンスとIAMロールを紐付けるコネクタ部分となるインスタンスプロファイルの箱を作成します。
aws iam create-instance-profile --instance-profile-name S3WriteProfile
インスタンスプロファイルとIAMロールの紐付け
先ほど作成したインスタンスプロファイルとIAMロールを紐付けします。
aws iam add-role-to-instance-profile --instance-profile-name S3WriteProfile --role-name S3WriteRole
インスタンスプロファイルとEC2インスタンスの紐付け
今まで作成してきたIAMポリシー、IAMロール、インスタンスプロファイルのまとまりをEC2インスタンスに紐付けます。
EC2インスタンスのインスタンスIDが必要となるので、以下コマンドで目的のEC2インスタンスを見つけ、インスタンスIDを控えましょう。
aws ec2 describe-instances
aws ec2 associate-iam-instance-profile --instance-id [インスタンスID] --iam-instance-profile Name=S3WriteProfile
ちなみにAWSコンソールのEC2インスタンスのセキュリティタブからIAMロール欄を見るとIAMロール名が表示されますが・・・
「アクション」→「セキュリティ」→「IAMロールを変更」から見ると作成したインスタンスプロファイルが結びついていることが確認できます。
S3バケット書き込みテスト
先ほどIAMポリシーファイルで許可したS3バケットと許可していないS3バケットに対してファイルコピーを実施し、IAMポリシーが有効になっているかを確認します。
テスト用S3バケットとテスト用ファイルは先に作成しておいてください。
aws s3 cp /home/ec2-user/writetest s3://instance-profile-test1
IAMポリシーで想定通りに許可されていれば、以下のように表示されます。
upload: ./writetest to s3://instance-profile-test1/writetest
書き込み許可されていないS3バケットに対して同様にファイルコピーを実施すると以下のように表示されます。
aws s3 cp /home/ec2-user/writetest s3://instance-profile-test2
upload failed: ./writetest to s3://instance-profile-test2/writetest An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
また、リスト表示の許可も与えているため、以下コマンドを実行すればリストも表示されます。
aws s3 ls s3://instance-profile-test1
YYYY-MM-DD hh:mm:ss 0 writetest
これでEC2インスタンスにアカウント情報を与えずにIAMロールで許可した操作を行えることが確認できました。
(おまけ)AWS CLIからのポリシー、ロール、インスタンスプロファイルの削除
おまけとして削除方法も書いておきます。
作成するときの逆をやるだけです。
- インスタンスプロファイルとEC2インスタンスの紐付け解除
- インスタンスプロファイルとIAMロールの紐付け解除
- インスタンスプロファイルの削除
- IAMロールとIAMポリシーの紐付け解除
- IAMロールの削除
- IAMポリシーの削除
ちなみに、IAMロールとインスタンスプロファイルを今回のように別名で作成した場合、AWSコンソールでIAMポリシーを結びつけるときに表示されるインスタンスプロファイルはAWS CLIからしか消せないので、IAMロールを消したのにプルダウンで表示されている場合は、後述のコマンドから削除しましょう。
先に次作業で使用するAssociation-id
を以下で確認して控えます。
aws ec2 describe-iam-instance-profile-associations
確認したAssociation-id
を使い、それぞれ削除していきます。
aws ec2 disassociate-iam-instance-profile --association-id iip-assoc-xxxxxxxxxxxxxxxxx
aws iam remove-role-from-instance-profile --instance-profile-name S3WriteProfile --role-name S3WriteRole
aws iam delete-instance-profile --instance-profile-name S3WriteProfile
aws iam detach-role-policy --role-name S3WriteRole --policy-arn arn:aws:iam::xxxxxxxxxxxx:policy/S3WritePolicy
aws iam delete-role --role-name S3WriteRole
aws iam delete-policy --policy-arn arn:aws:iam::xxxxxxxxxxxx:policy/S3WritePolicy
おわりに
私と同じようにインスタンスプロファイルに振り回されている人の助けになれば幸いです。