54
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

インスタンスプロファイルを理解するついでにポリシーとロールを整理する。

Last updated at Posted at 2020-12-24

はじめに

EC2インスタンスにCLIからインスタンスプロファイルを割り当てる作業を行った際、ちゃんと理解できてないなぁと感じたので、覚えがてらインスタンスプロファイルIAMポリシーIAMロールの関係について整理します。

IAMポリシーとは

AWSのリソースにアクセスする際の制御を行う機能です。

IAMポリシーにはAWSが事前に用意しているAWS管理ポリシーとユーザがカスタマイズして使うカスタマー管理ポリシーがあります。

AWS管理ポリシーAmazonS3ReadOnlyAccessAmazonEC2FullAccessなどの名前が付けられているため、利用するサービスへのアクセスに必要なポリシーを選んで各ユーザ、グループなどに割り当てることで各リソースへのアクセスを制限できます。

但し、AWS管理ポリシーを使う場合、ポリシーの編集はできないため、もし複数サービスへのアクセス許可を定義したポリシーを作成したかったり、サービスへのアクセス制御以外にIPアドレスでもアクセス制限したかったりする場合はカスタマー管理ポリシーを作成して、使いたいAWS管理ポリシーを選ぶことでユーザ独自のポリシーを作成することができます。

policy.png

IAMロールとは

EC2インスタンスやLambdaなどからAWSの各種サービスを利用したい場合に、AWSサービスの操作権限を与える機能です。

ユーザがAWS CLIやAWSコンソールからAWSのサービス、リソースを操作する場合、アクセスキーシークレットアクセスキーを使ってアクセスを行いますが、IAMポリシーIAMロールにアタッチして、さらにアタッチしたIAMロールをEC2インスタンス等に紐付けることでアクセスキーシークレットアクセスキーを設定しなくても、IAMポリシーで許可されているサービス、リソースを操作できます。

EC2インスタンスであれば、ユーザのアクセスキーをaws configureコマンドで登録してあげれば、ユーザに紐付けられているポリシーで`AWS CLIでアクセスすることもできますが、アクセスキーを登録する必要が無い分セキュリティ的に安全で、アクセスキーの登録ができないLambdaやECSのコンテナ上からも利用できるのがメリットです。

role.png

インスタンスプロファイルとは

EC2インスタンスIAMロールを結びつけるための箱です。

AWSコンソールから操作した場合にはインスタンスプロファイルなんて用語が出てきませんが、AWSコンソールからEC2インスタンスにIAMロールをアタッチするときにプルダウンで選択する名前がInstanceProfileです。

capture_19122020_173411.jpg

内部的には、IAMロールはEC2インスタンスに直接結びつけることができず、InstanceProfile経由でIAMロールを結びつけることでEC2インスタンスでIAMロールを使用できるようにしています。

InstanceProfile.png

ただ、AWSコンソールから操作した場合はIAMロールを選択することで、内部的に勝手にIAMロールと同じ名前でインスタンスプロファイルが作られて、IAMロールと結び付けられるので、インスタンスプロファイルという用語が出てこないわけです。

そのおかげでインスタンスプロファイルの概念を理解するのに記事一本書けてしまいました。

AWS CLIからのポリシー、ロール、インスタンスプロファイルの作成

IAMポリシー、IAMロール、インスタンスプロファイルの関係を理解するために、先ほどの図を少し修正した以下図を参考にAWS CLIから作っていこうと思います。

  1. IAMポリシーの作成
  2. IAMロールの作成
  3. IAMロールとIAMポリシーの紐付け
  4. インスタンスプロファイルの作成
  5. インスタンスプロファイルとIAMロールの紐付け
  6. インスタンスプロファイルとEC2インスタンスの紐付け

InstanceProfile2.png

前準備

今回は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というバケットに対する書き込み許可とリスト表示の許可設定を行っています。

IAMポリシーファイル
{
    "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は控えて下さい。

IAMポリシーの作成
aws iam create-policy --policy-name S3WritePolicy --policy-document file:///home/ec2-user/policy.json
create-policy実行例
{
    "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ロール徹底理解 〜 AssumeRoleの正体

今回はIAMロール作成時のデフォルトで作成します。

IAMロールファイル
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            }
        }
    ]
}

上記で作成したIAMポリシーファイルを使って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名を指定してください。

IAMロールとIAMポリシーの紐付け
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ロールを紐付けします。

インスタンスプロファイルとIAMロールの紐付け
aws iam add-role-to-instance-profile --instance-profile-name S3WriteProfile --role-name S3WriteRole

インスタンスプロファイルとEC2インスタンスの紐付け

今まで作成してきたIAMポリシー、IAMロール、インスタンスプロファイルのまとまりをEC2インスタンスに紐付けます。

EC2インスタンスのインスタンスIDが必要となるので、以下コマンドで目的のEC2インスタンスを見つけ、インスタンスIDを控えましょう。

EC2インスタンスIDの確認
aws ec2 describe-instances
インスタンスプロファイルとEC2インスタンスの紐付け
aws ec2 associate-iam-instance-profile --instance-id [インスタンスID] --iam-instance-profile Name=S3WriteProfile

ちなみにAWSコンソールのEC2インスタンスのセキュリティタブからIAMロール欄を見るとIAMロール名が表示されますが・・・

capture_23122020_081239.jpg

「アクション」→「セキュリティ」→「IAMロールを変更」から見ると作成したインスタンスプロファイルが結びついていることが確認できます。

capture_23122020_081317.jpg

S3バケット書き込みテスト

先ほどIAMポリシーファイルで許可したS3バケットと許可していないS3バケットに対してファイルコピーを実施し、IAMポリシーが有効になっているかを確認します。

テスト用S3バケットとテスト用ファイルは先に作成しておいてください。

書き込み許可されているS3バケットへのファイルコピー
aws s3 cp /home/ec2-user/writetest s3://instance-profile-test1

IAMポリシーで想定通りに許可されていれば、以下のように表示されます。

コピー成功時の表示例
upload: ./writetest to s3://instance-profile-test1/writetest

書き込み許可されていないS3バケットに対して同様にファイルコピーを実施すると以下のように表示されます。

書き込み許可されていない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

また、リスト表示の許可も与えているため、以下コマンドを実行すればリストも表示されます。

リスト表示許可されているS3バケットのリスト表示
aws s3 ls s3://instance-profile-test1
リスト表示許可されているS3バケットのリスト表示結果
YYYY-MM-DD hh:mm:ss          0 writetest

これでEC2インスタンスにアカウント情報を与えずにIAMロールで許可した操作を行えることが確認できました。

(おまけ)AWS CLIからのポリシー、ロール、インスタンスプロファイルの削除

おまけとして削除方法も書いておきます。
作成するときの逆をやるだけです。

  1. インスタンスプロファイルとEC2インスタンスの紐付け解除
  2. インスタンスプロファイルとIAMロールの紐付け解除
  3. インスタンスプロファイルの削除
  4. IAMロールとIAMポリシーの紐付け解除
  5. IAMロールの削除
  6. IAMポリシーの削除

ちなみに、IAMロールとインスタンスプロファイルを今回のように別名で作成した場合、AWSコンソールでIAMポリシーを結びつけるときに表示されるインスタンスプロファイルはAWS CLIからしか消せないので、IAMロールを消したのにプルダウンで表示されている場合は、後述のコマンドから削除しましょう。

先に次作業で使用するAssociation-idを以下で確認して控えます。

Association-idの確認
aws ec2 describe-iam-instance-profile-associations

確認したAssociation-idを使い、それぞれ削除していきます。

インスタンスプロファイルとEC2インスタンスの紐付け解除
aws ec2 disassociate-iam-instance-profile --association-id iip-assoc-xxxxxxxxxxxxxxxxx
インスタンスプロファイルとIAMロールの紐付け解除
aws iam remove-role-from-instance-profile --instance-profile-name S3WriteProfile --role-name S3WriteRole
インスタンスプロファイルの削除
aws iam delete-instance-profile --instance-profile-name S3WriteProfile
IAMロールとIAMポリシーの紐付け解除
aws iam detach-role-policy --role-name S3WriteRole --policy-arn arn:aws:iam::xxxxxxxxxxxx:policy/S3WritePolicy
IAMロールの削除
aws iam delete-role --role-name S3WriteRole
IAMポリシーの削除
aws iam delete-policy --policy-arn arn:aws:iam::xxxxxxxxxxxx:policy/S3WritePolicy

おわりに

私と同じようにインスタンスプロファイルに振り回されている人の助けになれば幸いです。

参考記事

54
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?