📝 概要
こちらの投稿は2025 Japan AWS Jr.Championsの有志メンバーで作成した『30日間で主要AWSサービスを構築できるようになる』をテーマにした初学者向けのハンズオン問題集のDAY1になります!
問題集の趣旨や作成に至るまでの経緯は以下の記事をご覧いただければと思います。
https://qiita.com/satosato_kozakana/items/446971c2deca7e27d0aa
| 項目 | 内容 |
|---|---|
| 所要時間 | 約1時間 |
| メインサービス | AWS IAM |
| 学べること | IAMユーザー、IAMロール による権限管理とアクセス制御 |
| 想定費用 | 約10円(※EC2の起動時間とS3の使用量により変動します) |
🎯 課題内容
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インスタンスを作成する
-
以下の表のように設定します。特に記載がないものはデフォルトのままで構いません。「インスタンスを起動」からインスタンスを起動します。
項目 値 備考 名前 handson-instance Amazonマシンイメージ(AMI) Amazon Linux 2023 kernel-6.1 AMI Amazon Linux 2023 から始まるものを選択してください。 インスタンスタイプ t2.micro t2.microを使用することで無料利用枠の対象となります。 キーペア キーペアなしで続行
✅ ステップ2:IAMユーザーに関連づけるためのIAMポリシーを作成する
-
ポリシーエディタでJSONを指定します。以下のJSONをコピー&ペーストします。「次へ」を押して先に進みます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ForS3",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"*"
]
},
{
"Sid": "ForEC2",
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:StartInstances"
],
"Resource": [
"*"
]
}
]
}

4. ポリシー名をhandson-iam-user-policyとして「ポリシーの作成」を押してポリシーを作成します。

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

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

-
コンソールサインインの詳細に書いてある「コンソールサインインURL」「ユーザー名」「コンソールパスワード」メモしておきます。
✅ ステップ4:IAMユーザーでサインインする
-
IAMユーザー名、パスワードを入力してサインインします。
-
サインイン後のリージョンがどこになっているかに注意します。先ほどEC2インスタンスを作ったリージョンと同じリージョンにします。
✅ ステップ5:S3の操作ができることを確認する
-
バケット名を
handson-s3-1-<自分の名前>とします。それ以外はデフォルト値のまま「バケットの作成」を押します。

-
同様にして
handson-s3-2-<自分の名前>というS3バケットも作成します。 -
handson-s3-2-<自分の名前>のバケットを選択します。「フォルダの作成」からフォルダ名をopenとして「フォルダの作成」を押します。

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

-
「アップロード」を押して、適当なファイルをアップロードします。「ファイルを追加」を押すとローカルからファイルをアップロードできます。
-
closeフォルダにも適当なファイルをアップロードもしておきます。 -
ファイルの削除やバケットの削除もできます。試してみましょう。ここで削除したものはすべて再作成しておいてください。以降のステップで使用します。
✅ ステップ6:EC2の起動ができることの確認とその他の操作ができないことの確認をする
-
「インスタンスの状態」から「インスタンスを停止」を選択します。これは失敗し、権限エラーが表示され、停止できないことを確認します。

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

✅ ステップ7:元の権限でサインインし直す
- IAMロールの作成に移っていきます。その前に、元の強い権限でサインインをし直します。
- これまでルートユーザーを使用してきた方は、これまでのステップを参考に操作用のIAMユーザーを作成するとベストプラクティスに近づきます。
AdministratorAccessをポリシーとして関連づけることをおすすめします。
✅ ステップ8:IAMロール用のIAMポリシーを作成する
- マネジメントコンソールで「IAM」を検索し、選択します。左のメニュータブから「ポリシー」を選択し、「ポリシーの作成」に進みます。
- 今回の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/*" ] } ] } - ポリシー名を
handson-iam-role-policyとして「ポリシーの作成」を押してポリシーを作成します。
✅ ステップ9:IAMロールを作成する
-
許可ポリシーから
handson-iam-role-policyとAmazonSSMManagedInstanceCoreを選択して追加します。
✅ ステップ10:EC2インスタンスに作成したIAMロールをアタッチする
-
「EC2」の「インスタンス」から
handson-instanceに進みます。 -
「インスタンスの状態」から「インスタンスを停止」で停止します。
-
インスタンスの状態が
停止済みになったことを確認して、「アクション」の「セキュリティ」にある「IAMロールを変更」に進みます。

-
「インスタンスの状態」から「インスタンスを開始」でインスタンスを起動し直します。
✅ ステップ11:EC2インスタンスに接続してS3の操作ができることを確認する
-
handson-instanceを選択して「接続」を押し、「セッションマネージャー」の「接続」からEC2インスタンスに接続します。

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

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を適切に使用する必要があります。今日から始まるハンズオン、頑張っていきましょう!!



















