让网站读取私有 S3 素材

AWSBeginner
立即练习

介绍

作品站已经运行,图片也在私有 S3 中,但应用尚无读取身份。关联准备好的角色,让图片实际显示,再清理本节关联。

请先完成前四个作品站实验。本节独立提供网站、私有 Bucket、图片和角色;角色由你关联。 每节使用独立的新环境,无需保留上一节的资源、文件或凭据。工具、连接和无关素材均已准备好。

认证考点

认证 考试任务 练习内容
AWS Certified Cloud Practitioner (CLF-C02) Task 2.3 为应用使用角色,并理解仅允许读取指定对象的权限。

实验概览

概念图:EC2 角色授权私有对象读取,网站向访客返回图片。

理解应用缺少的读取权限

本步骤,你将在关联角色前,确认私有设计素材存在并检查读取范围。

从 AWS View 打开网站。排版和简介正常,但三张作品图不能加载,作品详情也尚未就绪。应用配置为从私有 S3 读取图片和 projects.json。Terminal 的身份与 EC2 应用的身份是不同调用者,应用不会自动继承你的权限。

进入项目并加载本节标识:

cd /home/labex/project
source website.env
echo "$PORTFOLIO_BUCKET"

确认四个对象存在:

aws s3api list-objects-v2 --bucket "$PORTFOLIO_BUCKET"

应有 images/aura-brand.webp、images/forma-chair.webp、images/echo-record.webp 和 projects.json。对象存在与应用获准读取是两个条件。

IAM 角色通过临时凭据为工作负载提供身份和权限;instance profile 将角色关联到 EC2。本节二者都叫 portfolio-reader,准备好的信任策略允许 EC2 使用角色。

读取提供好的策略:

cat read-image-policy.json

Effect: Allow 允许 s3:GetObject 读取。Resource 数组列出四个对象的准确 ARN,即完整的 AWS 资源标识。它不允许写入,也不允许其他对象。这是最小权限:只授权网站需要的四份素材,而不是公开 Bucket 或授予所有 S3 操作。

下一步关联 profile。浏览器从网站获得图片,不会获得应用凭据,也不会直接公开访问 Bucket。

为网站关联读取角色

本步骤,你将关联准备好的 profile,并确认应用实际读取私有 S3 图片。

显示要授权的实例:

echo "$INSTANCE_ID"

associate-iam-instance-profile 将 profile 关联到实例,Name=portfolio-reader 选择准备好的 profile。保存返回的关联 ID,以便稍后准确移除。$(...) 保存输出,--query 选择一个字段,--output text 返回普通文本:

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"

该值以 iip-assoc- 开头,标识关联,不是实例或角色本身。

刷新作品站,AURA、FORMA 和 ECHO 三张封面应加载。点击封面打开详情,标题和短说明来自 S3 的 projects.json。网站的 AWS SDK 从实例角色取得临时凭据,并用它读取三张图片与作品列表;你没有向应用复制访问密钥。

若图片未立即出现,等待关联就绪再刷新,检查实例与 profile 是否正确。保持 Bucket 私有,不要通过扩大公开访问来绕过本节任务。

实际图片示例:关联实例角色后,网站读取并显示私有 S3 中的作品图片。

实际图片证明了这条关系:浏览器请求网站,EC2 应用获得读取授权,从 S3 取回图片,再返回给浏览器。

真实实验检查点示例,标识因环境而异。

移除关联并终止服务器

本步骤,你将移除本节添加的授权关联,并终止一次性工作负载。

使用保存的准确关联 ID:

aws ec2 disassociate-iam-instance-profile --association-id "$ASSOCIATION_ID"

角色使用临时凭据,应用可能已经缓存它们。移除 profile 不代表所有已有凭据立即失效,因此不要把立即出现的破图当作凭据撤销证明。本节移除关联后再终止工作负载,使其无法继续请求。

aws ec2 terminate-instances --instance-ids "$INSTANCE_ID"
aws ec2 wait instance-terminated --instance-ids "$INSTANCE_ID"

AWS View 应显示 terminated,刷新网站应提示不再运行。读取角色、私有 Bucket 和参考数据是提供好的素材,应保留。检查会确认关联已移除、工作负载已终止。

总结

你区分 Terminal 与应用的身份,理解仅针对四个作品对象的策略,通过 instance profile 关联角色,并确认实际私有图片加载。随后移除关联并终止工作负载。

官方参考:EC2 应用角色、instance profiles。