はじめに
限定された EC2 ロールを接続し、アクセスキーをコピーせずに非公開 S3 画像を表示します。
先に前段のポートフォリオラボを完了してください。この環境は必要な前段機能と独自のリソースを提供します。以前のインスタンス、ファイル、認証情報ではなく知識を引き継ぎます。
認定試験との関連
| 認定 | タスク | 練習内容 |
|---|---|---|
| AWS Certified Cloud Practitioner (CLF-C02) | Task 2.3 | インスタンスロールで 4 オブジェクトだけの読取をサイトに認可する。 |
ラボの概要

画像が読めない理由を調べる
このステップでは、 最初にサイトを開くとページは表示されても画像がありません。操作者の CLI の権限と EC2 アプリの権限は別です。非公開バケットを公開して解決しません。
フォルダーへ移動します。
cd /home/labex/project
識別子を読みます。
source website.env
echo "$PORTFOLIO_BUCKET"
バケット内に画像が存在することを確認します。
aws s3api list-objects-v2 --bucket "$PORTFOLIO_BUCKET"
ポリシーは s3:GetObject を許可します。Resource 配列には 3 画像と projects.json の正確な ARN があり、書込や他のオブジェクトは許可しません。ARN は完全なリソース識別子で、この 4 オブジェクトの限定が最小権限です。
cat read-image-policy.json
提供されたロールの信頼ポリシーは EC2 を許可します。インスタンスプロファイルがロールを EC2 に結び付けます。画像の存在とアプリの認可は別の条件です。
ロールを接続して画像を見る
このステップでは、 アプリが一時認証情報を取得できるようにします。SDK は IMDSv2 を使い、ロールの認証情報で S3 を読みます。秘密鍵やアクセスキーはコピーしません。
INSTANCE_ID を表示して AWS View と比較します。
echo "$INSTANCE_ID"
associate が指定プロファイルを接続し、$(...) で戻り値を取得します。query が AssociationId を選び、output text が文字列を返します。接続 ID を変数に保存し echo で確認します。
ASSOCIATION_ID=$(aws ec2 associate-iam-instance-profile --instance-id "$INSTANCE_ID" --iam-instance-profile Name=portfolio-reader --query 'IamInstanceProfileAssociation.AssociationId' --output text)
echo "$ASSOCIATION_ID"
再読み込みして AURA、FORMA、ECHO を確認します。画像をクリックすると S3 の projects.json からタイトルと説明を読みます。バケットは非公開のままにし、必要ならインスタンスとプロファイルを確認します。SDK は IMDSv2 の一時認証情報を使い、キーはコピーしません。


接続とサーバーを片付ける
このステップでは、 自分の接続を解除してからサーバーを終了します。
保存した接続 ID で解除します。
aws ec2 disassociate-iam-instance-profile --association-id "$ASSOCIATION_ID"
指定インスタンスを終了します。
aws ec2 terminate-instances --instance-ids "$INSTANCE_ID"
最終状態を待ちます。
aws ec2 wait instance-terminated --instance-ids "$INSTANCE_ID"
解除しても既に取得した一時認証情報が即時無効になるとは限りません。終了でこの実行主体を止めます。バケット、ロール、参照データとネットワークは残します。
まとめ
インスタンスプロファイルでアプリに限定した読取権限を与え、実際の画像を確認して接続を解除しました。
公式ドキュメント: EC2 application roles, instance profiles.



