18
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【30日でAWSをマスターするハンズオン問題集】Day1:AWSのアクセス制御「IAM」

Last updated at Posted at 2025-11-26

📝 概要

こちらの投稿は2025 Japan AWS Jr.Championsの有志メンバーで作成した『30日間で主要AWSサービスを構築できるようになる』をテーマにした初学者向けのハンズオン問題集のDAY1になります!
問題集の趣旨や作成に至るまでの経緯は以下の記事をご覧いただければと思います。
https://qiita.com/satosato_kozakana/items/446971c2deca7e27d0aa

項目 内容
所要時間 約1時間
メインサービス AWS IAM
学べること IAMユーザー、IAMロール による権限管理とアクセス制御
想定費用 約10円(※EC2の起動時間とS3の使用量により変動します)

⚠️ 注意:以下のリソースを削除しないと継続的に課金されます

※AWS IAMの使用自体に料金は発生しません

🎯 課題内容

AWS Identity and Access Management(以下IAM)とは、AWSリソース(EC2インスタンスやS3バケット、データベースなど)へのアクセスを安全に管理するサービスです。IAMを使用すると、「誰が」「どのAWSサービスやリソースに対して」「どのような操作を」できるかを細かく制御できます。

Amazon EC2(以下EC2)という仮想サーバーを提供するサービスと、Amazon S3(以下S3)というデータを保管できるストレージサービスを使用して練習していきます。これらのサービスは後のハンズオンで詳しく学ぶので、今回は「EC2インスタンス=仮想サーバー」「S3=ストレージ」という理解で十分です。

🔧 実装機能

1. IAMユーザーの作成

以下の権限を持つIAMユーザーを作成します:

  • マネジメントコンソールへのアクセス:サインインが可能
  • Amazon S3: すべての操作が可能(バケットの作成・削除、オブジェクトのアップロード・削除など)
  • Amazon EC2: 既存インスタンスの起動のみ可能(新規作成・停止・終了は不可)

2. IAMロールを使用したEC2からS3へのアクセス制御

EC2インスタンスにIAMロールをアタッチし、以下の操作を可能にします:

  • handson-s3-1-<自分の名前> バケットへのオブジェクトのアップロード・取得・削除
  • handson-s3-2-<自分の名前> バケット内の open/ ディレクトリ配下のオブジェクトの取得のみ(読み取り専用)

S3バケット名の命名について

S3バケットの名前は全世界で一意である必要があります。handson-s3-1-<自分の名前><自分の名前> 部分は、以下のように置き換えてください:

  • 例: handson-s3-1-yourname
  • 例: handson-s3-1-20251126-abc123(日付+ランダム文字列)

バケット作成時に「バケット名は既に使用されています」というエラーが出た場合は、別の文字列で試してください。

💡 実装のヒント

IAMポリシー

IAMポリシーは、「誰が」「何を」「できるか/できないか」を定義するAWSオブジェクトです。IAMユーザーやIAMロールがAWSリソースにアクセスしようとすると、AWSはそれらにアタッチされたIAMポリシーを確認し、アクセスを許可するか拒否するかを判断します。

AWSによって事前に用意されたポリシー(AWS管理ポリシー、例:AdministratorAccess)もありますが、今回のような細かい権限制御には、カスタマーマネージドポリシーを自分で作成する必要があります。

IAMポリシーの作成方法

IAMポリシーは以下の2つの方法で作成できます:

  • ビジュアルエディタ: GUIで項目を選択して作成
  • JSON: コードで直接記述(推奨)

JSON形式での作成を推奨する理由

  • 細かい制御が可能
  • コピー&ペーストで再利用しやすい
  • Infrastructure as Code(IaC)を書く際にも役にたつ

IAMポリシーのJSON構造

以下は、「EC2インスタンスの起動のみを許可する」ポリシーの例です:

{
    "Version": "2012-10-17",
    "Statement": [
	    {
	        "Sid": "ForEC2InstanceActions",
	        "Effect": "Allow",
	        "Action": [
		        "ec2:StartInstances"
	        ],
	        "Resource": [
		        "*"
	        ]
	    }
    ]
}

各要素の説明

要素 説明
Version ポリシー言語のバージョン。必ず 2012-10-17 を指定 "2012-10-17"
Statement 権限設定の本体。配列で複数のルールを記述可能 [{...}, {...}]
Sid Statement ID。このルールの説明 "ForEC2InstanceActions"
Effect 許可(Allow)か拒否(Deny)を指定 "Allow"
Action 許可/拒否する操作。配列で複数指定可能 ["ec2:StartInstances"]
Resource このルールを適用するリソース。*はすべてのリソース "*"

より詳しい情報は、公式ドキュメントを参照してください。

IAMユーザー

IAMユーザーは、「人」や「アプリケーション」を表すAWSプリンシパルです。各IAMユーザーには固有の認証情報(ユーザー名とパスワード、またはアクセスキー)を付与することができ、それらを使ってマネジメントコンソールにログインしたり、AWS CLIでAWSリソースを操作したりできます。

IAMポリシーをIAMユーザーにアタッチすることで、そのユーザーができる操作を制御します。明示的に許可されていない操作は、すべて拒否されます(暗黙の拒否)。

IAMユーザーの特徴

  • AWSアカウント内に複数作成できる
  • それぞれ異なる権限を設定できる
  • 長期的な認証情報を持つ

ルートユーザーとの違い

AWSアカウントを作成した際のメールアドレスでログインするアカウントを「ルートユーザー」と呼びます。ルートユーザーはすべての権限を持ち、制限をかけることができないので、日常的な作業にはIAMユーザーを使用することが推奨されています。

IAMユーザーとIAM Identity Center

近年、AWSでは AWS IAM Identity Center(旧AWS SSO)の使用が推奨されており、IAMユーザーの使用は推奨されなくなりつつあります。

IAM Identity Centerのメリット

  • 一元的なアクセス管理
  • 一時的な認証情報の使用
  • 複数アカウントの管理が容易

それでもIAMユーザーを使う場面

  • 個人の学習・検証用アカウント
  • 小規模なプロジェクト
  • 単一AWSアカウントでの使用

このハンズオンでは、IAMの基本を理解するためにIAMユーザーを使用します。AWS IAM Identity Centerについては、今は理解する必要はありません。

IAMロール

IAMロールは、AWSリソース(EC2インスタンスなど)が一時的に「引き受ける(Assume)」ことができるAWSプリンシパルです。

IAMポリシーをIAMロールにアタッチすることで、そのロールを引き受けたリソースができる操作を制御します。明示的に許可されていない操作は、すべて拒否されます(暗黙の拒否)。

IAMロールの特徴

  • AWSアカウント内に複数作成できる
  • 引き受けることができるリソースの種類を指定できる
  • それぞれ異なる権限を設定できる
  • 一時的な認証情報を付与する
IAMユーザーとIAMロールの違い

IAMユーザーとIAMロールの違いを認識することは、AWSのセキュリティ設計において重要です。

項目 IAMユーザー IAMロール
対象 人やアプリケーション AWSリソース
認証情報 パスワード、アクセスキー(長期的) 一時的な認証情報(自動更新)
用途 人間がAWSを操作 EC2からS3にアクセスなど

EC2インスタンスからS3にアクセスする場合は、以下の2つの方法が考えられます:

❌ 悪い方法: IAMユーザーを使用

  • IAMユーザーのアクセスキーをEC2に保存
  • アクセスキーが漏洩するリスクがある
  • アクセスキーのローテーションが必要

⭕️ 良い方法: IAMロールを使用

  • 一時的な認証情報が自動で発行・更新される
  • アクセスキーの管理が不要
  • セキュリティリスクが低い

IAMロールを使用することで、セキュアにAWSリソース間のアクセスを制御できます。

セキュリティのベストプラクティス

IAMを使用する際の重要なセキュリティポイント:

  • 最小権限の原則:必要最小限の権限のみを付与する
  • ルートユーザーの保護:日常的な作業には使用しない
  • IAMロールの活用:可能な限りアクセスキーではなくIAMロールを使用
  • 定期的な見直し:不要になった権限やユーザーは削除する
  • MFA(多要素認証)の有効化:重要なアカウントにはMFAを設定
EC2からS3へのアクセス確認方法

EC2インスタンスからS3バケットにアクセスできるか確認するには、AWS Systems Manager Session Manager(SSM) を使用します。SSM Session Managerは、ブラウザから直接EC2インスタンスにアクセスできるサービスです。設定が簡単でセキュアにインスタンス操作が可能です。

EC2インスタンスに関連づけるIAMロールに、AWS管理ポリシー AmazonSSMManagedInstanceCore を追加します。これにより、EC2インスタンスの「接続」メニューから「セッションマネージャー」による接続が可能になります。

接続後は、AWS CLIを使用してS3バケットを操作します。Amazon Linux 2023を使用すると、AWS CLIはプレインストールされているため、すぐに操作を開始できます。

✅ 完成後のチェックポイント

IAMユーザーの動作確認

  • 作成したIAMユーザーでマネジメントコンソールにサインインできる
  • マネジメントコンソールからS3バケットの作成・削除、オブジェクトのアップロード・削除ができる
  • マネジメントコンソールからEC2インスタンスの起動ができる
  • マネジメントコンソールからEC2インスタンスの新規作成・停止・終了ができない(権限エラーが表示される)

IAMロールの動作確認

  • EC2インスタンスにSSM Session Managerで接続できる
  • EC2からhandson-s3-1-<自分の名前>バケットへのオブジェクトのアップロード・取得・削除ができる
  • EC2からhandson-s3-1-<自分の名前>バケットの削除ができない(権限エラーが表示される)
  • EC2からhandson-s3-2-<自分の名前>バケット内のopen/ディレクトリ配下のオブジェクトの取得ができる
  • EC2からhandson-s3-2-<自分の名前>バケット内のopen/ディレクトリ配下のオブジェクトのアップロード・削除ができない(権限エラーが表示される)
  • EC2からhandson-s3-2-<自分の名前>バケット内のopen/ディレクトリ配下以外へのオブジェクト操作ができない(権限エラーが表示される)

🔗 リファレンスリンク

🛠️ 解答・構築手順(クリックで開く)

解答と構築手順を見る

✅ ステップ1:検証に使用するEC2インスタンスを作成する

  1. マネジメントコンソールで「EC2」を検索し、選択します。
    EC2コンソール画面

  2. 左のメニュータブから「インスタンス」を選択し、「インスタンスを起動」からインスタンスの作成に進みます。
    EC2インスタンス画面

  3. 以下の表のように設定します。特に記載がないものはデフォルトのままで構いません。「インスタンスを起動」からインスタンスを起動します。

    項目 備考
    名前 handson-instance
    Amazonマシンイメージ(AMI) Amazon Linux 2023 kernel-6.1 AMI Amazon Linux 2023 から始まるものを選択してください。
    インスタンスタイプ t2.micro t2.microを使用することで無料利用枠の対象となります。
    キーペア キーペアなしで続行
  4. IAMユーザーでの起動テストのためにインスタンスを停止しておきます。インスタンスのボックスを選択します。
    EC2インスタンス作成後画面

  5. 「インスタンスの状態」から「インスタンスの停止」を押して、インスタンスを停止します。停止済みになったことを確認します。
    EC2インスタンス停止画面
    EC2インスタンス停止確認画面

✅ ステップ2:IAMユーザーに関連づけるためのIAMポリシーを作成する

  1. マネジメントコンソールで「IAM」を検索し、選択します。
    IAMコンソール画面

  2. 左のメニュータブから「アクセス管理」の中の「ポリシー」を選択し、「ポリシーの作成」に進みます。
    IAMポリシー画面

  3. ポリシーエディタでJSONを指定します。以下のJSONをコピー&ペーストします。「次へ」を押して先に進みます。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "ForS3",
			"Effect": "Allow",
			"Action": [
			    "s3:*"
			],
			"Resource": [
			    "*"
			]
		},
		{
		    "Sid": "ForEC2",
		    "Effect": "Allow",
		    "Action": [
                "ec2:DescribeInstances",
		        "ec2:StartInstances"
		    ],
		    "Resource": [
		        "*"    
		    ]
		}
	]
}

IAMポリシーエディタ画面
4. ポリシー名をhandson-iam-user-policyとして「ポリシーの作成」を押してポリシーを作成します。
IAMポリシー確認画面

✅ ステップ3:IAMユーザーを作成する

  1. 「IAM」の左のメニュータブから「アクセス管理」の中の「ユーザー」を選択し、「ユーザーの作成」に進みます。
    IAMユーザー画面

  2. ユーザー名をhandson-iam-userとします。「AWSマネジメントコンソールへのユーザーアクセスを提供する」にチェックを入れて「次へ」を押します。
    IAMユーザー作成画面

  3. 許可のオプションとして「ポリシーを直接アタッチする」として、許可ポリシーからhandson-iam-user-policyを検索してチェックを入れます。「次へ」を押します。
    IAMユーザーポリシーアタッチ画面

  4. 確認して作成から「ユーザーの作成」を押して、ユーザーを作成します。
    IAMユーザー確認画面

  5. コンソールサインインの詳細に書いてある「コンソールサインインURL」「ユーザー名」「コンソールパスワード」メモしておきます。

✅ ステップ4:IAMユーザーでサインインする

  1. コンソールサインインURLにアクセスします。アカウントIDがすでに入力された状態へと飛びます。
    サインイン画面

  2. IAMユーザー名、パスワードを入力してサインインします。

  3. パスワードのリセットが求められます。今回は適当にリセットしましょう。
    パスワードリセット画面

  4. サインイン後のリージョンがどこになっているかに注意します。先ほどEC2インスタンスを作ったリージョンと同じリージョンにします。

✅ ステップ5:S3の操作ができることを確認する

  1. マネジメントコンソールで「S3」を検索し、選択します。「バケットの作成」に進みます。
    S3コンソール画面

  2. バケット名をhandson-s3-1-<自分の名前>とします。それ以外はデフォルト値のまま「バケットの作成」を押します。
    S3作成画面

  3. 同様にしてhandson-s3-2-<自分の名前>というS3バケットも作成します。

  4. handson-s3-2-<自分の名前>のバケットを選択します。「フォルダの作成」からフォルダ名をopenとして「フォルダの作成」を押します。
    S3フォルダ作成画面

  5. 同様にしてcloseフォルダも作成します。
    S3フォルダ画面

  6. handson-s3-2-<自分の名前>/openにファイルをアップロードします。適当なファイルを用意してください。「openフォルダ」をクリックします。
    S3ファイルアップロード画面

  7. 「アップロード」を押して、適当なファイルをアップロードします。「ファイルを追加」を押すとローカルからファイルをアップロードできます。

  8. closeフォルダにも適当なファイルをアップロードもしておきます。

  9. ファイルの削除やバケットの削除もできます。試してみましょう。ここで削除したものはすべて再作成しておいてください。以降のステップで使用します。

✅ ステップ6:EC2の起動ができることの確認とその他の操作ができないことの確認をする

  1. マネジメントコンソールで「EC2」を検索し、選択します。「インスタンス」の画面へと進みます。
    EC2インスタンス一覧画面

  2. 「インスタンスの状態」から「インスタンスを開始」を選択します。
    EC2インスタンス開始画面
    EC2インスタンス開始確認画面

  3. 「インスタンスの状態」から「インスタンスを停止」を選択します。これは失敗し、権限エラーが表示され、停止できないことを確認します。
    EC2インスタンス停止エラー画面

  4. マネジメントコンソールから「IAM」を検索します。アクセス権限がないのでIAMポリシーなどのリソース一覧を確認しようとするとエラーが出ます。
    IAMポリシーエラー画面

✅ ステップ7:元の権限でサインインし直す

  1. IAMロールの作成に移っていきます。その前に、元の強い権限でサインインをし直します。
  2. これまでルートユーザーを使用してきた方は、これまでのステップを参考に操作用のIAMユーザーを作成するとベストプラクティスに近づきます。AdministratorAccessをポリシーとして関連づけることをおすすめします。

✅ ステップ8:IAMロール用のIAMポリシーを作成する

  1. マネジメントコンソールで「IAM」を検索し、選択します。左のメニュータブから「ポリシー」を選択し、「ポリシーの作成」に進みます。
  2. 今回のJSONは以下のようになります。
    {
    	"Version": "2012-10-17",
    	"Statement": [
    		{
    			"Sid": "ForS31",
    			"Effect": "Allow",
    			"Action": [
    			    "s3:PutObject",
                    "s3:GetObject",
                    "s3:DeleteObject",
                    "s3:ListBucket"
    			],
    			"Resource": [
    			    "arn:aws:s3:::handson-s3-1-<自分の名前>",
                    "arn:aws:s3:::handson-s3-1-<自分の名前>/*"
    			]
    		},
    		{
                "Sid": "ForS32OpenList",
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::handson-s3-2-<自分の名前>"
                ],
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "open/*"
                        ]
                    }
                }
            },
            {
                "Sid": "ForS32OpenGet",
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject"
                ],
                "Resource": [
                    "arn:aws:s3:::handson-s3-2-<自分の名前>/open/*"
                ]
            }
    	]
    }
    
  3. ポリシー名をhandson-iam-role-policyとして「ポリシーの作成」を押してポリシーを作成します。
    IAMポリシー作成画面

✅ ステップ9:IAMロールを作成する

  1. 「IAM」の左のメニュータブから「ロール」を選択し、「ロールを作成」へ進みます。
    IAMロール画面

  2. 信頼されたエンティティタイプとして「AWSのサービス」を選択し、ユースケースを「EC2」とします。
    IAMロールエンティティ選択画面

  3. 許可ポリシーからhandson-iam-role-policyAmazonSSMManagedInstanceCoreを選択して追加します。

  4. ロール名をhandson-iam-roleとして「ロールを作成」します。
    IAMロール作成画面

✅ ステップ10:EC2インスタンスに作成したIAMロールをアタッチする

  1. 「EC2」の「インスタンス」からhandson-instanceに進みます。

  2. 「インスタンスの状態」から「インスタンスを停止」で停止します。

  3. インスタンスの状態が停止済みになったことを確認して、「アクション」の「セキュリティ」にある「IAMロールを変更」に進みます。
    EC2IAMロール変更画面

  4. IAMロールとしてhandson-iam-roleを選択します。「IAMロールの更新」へと進みます。
    EC2IAMロール更新画面

  5. 「インスタンスの状態」から「インスタンスを開始」でインスタンスを起動し直します。

✅ ステップ11:EC2インスタンスに接続してS3の操作ができることを確認する

  1. handson-instanceを選択して「接続」を押し、「セッションマネージャー」の「接続」からEC2インスタンスに接続します。
    EC2接続画面

  2. 以下のコマンドを順に試して、handson-s3-1-<自分の名前>に対するファイルのアップロード操作を確認します。S3へアップロードされていることもマネジメントコンソールから確認しましょう。

sudo echo "test" > test.txt
sudo aws s3 cp test.txt s3://handson-s3-1-<自分の名前>/

S3ファイルアップロード確認画面
3. 以下のコマンドを順に試して、handson-s3-2-<自分の名前>open配下からファイルの取得ができることを確認します。openに保存しておいたファイルの中身が表示されることを確認します。

sudo aws s3 cp s3://handson-s3-2-<自分の名前>/open/<自分がアップロードしたファイル名> <自分がアップロードしたファイル名> 
sudo cat <自分がアップロードしたファイル名> 

このコマンドは、handson-s3-1-<自分の名前> バケットの open フォルダからファイルをダウンロードしようとします。IAMロールにアタッチしたポリシーが明示的に許可しているので、ダウンロードすることができます。
4. 以下のコマンドを順に試して、handson-s3-2-<自分の名前>close配下からファイルの取得ができないことを確認します。エラーがでます。

sudo aws s3 cp s3://handson-s3-2-<自分の名前>/close/<自分がアップロードしたファイル名> <自分がアップロードしたファイル名> 

このコマンドは、handson-s3-2-<自分の名前> バケットの close フォルダにあるファイルをダウンロードしようとしますが、IAMロールの権限不足となるからです。
5. その他にも、S3バケットの削除やその他のリソースへのアクセスができないことも試してみましょう。権限エラーが表示されます。

🧹 片付け(リソース削除)

  • EC2インスタンスを削除
  • S3バケットを削除
  • IAMロールを削除
  • IAMユーザーを削除
  • IAMポリシーを削除

🏁 おつかれさまでした!

このハンズオンではIAMの使い方を学びました。IAMはユーザーやAWSリソースの間のアクセス制御をする重要なサービスです。様々なAWSサービスを使用するのにIAMの機能を使うことが必要になります。また、セキュリティを担保するためにはIAMを適切に使用する必要があります。今日から始まるハンズオン、頑張っていきましょう!!

18
9
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
18
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?