写点什么

使用 AWS 控制台或命令行将 AWS IAM 角色附加到现有的 Amazon EC2 实例中

  • 2019-11-18
  • 本文字数:5574 字

    阅读完需:约 18 分钟

使用AWS控制台或命令行将AWS IAM角色附加到现有的Amazon EC2实例中

简介

AWS IAM(身份和访问管理服务)中的角色使您的应用程序在 Amazon EC2 上能够使用临时的安全凭证自动实现 AWS 服务的创建,发布和内容修改。使用这样的临时凭证是 IAM 的最佳做法,因为您不再需要在实例上维护一个或多个长期密钥。对 EC2 使用 IAM 角色也无需再使用必须手动或以编程方式管理的长期 AWS 访问密钥。


例如,应用程序必须通过 AWS 证书签署 API 请求。因此,如果您是应用程序开发人员,您需要一个策略来为 EC2 实例上运行的应用程序管理证书。您可以安全地将您的 AWS 证书分配至实例,从而允许这些实例上运行的应用程序使用您的证书签署请求,并保护其免受其他用户的影响。但是,要将凭证安全地分配至每项实例有一定难度,尤其是 AWS 以您的名义创建的实例,例如竞价型实例或 Auto Scaling 组中的实例。当您更换 AWS 证书时,您还必须能够更新每项实例上的证书。IAM 角色能够委托授权以发出 API 请求,而不用创建并分配您的 AWS 证书。详细解决方案,请查阅文档适用于Amazon EC2的IAM角色


之前,IAM 角色只能在实例创建设置时添加,这导致了过去创建的实例和忘记添加 IAM 角色的实例无法使用 IAM 角色操作实例,从而被迫重新部署实例及应用程序。从现在开始,您可以通过将 IAM 角色附加到现有的尚未被角色附加的 EC2 实例,来使用 AWS 提供的临时安全证书操作 EC2 实例,您还可以随时替换附加到现有 EC2 实例的 IAM 角色。

适用范围

文中的操作步骤已于 2017 年 2 月 23 日验证通过,其中 AWS CLI 版本 1.11.48,在 AWS 全球和 AWS 中国区均能正常使用。

解决方案

  1. 创建 IAM 角色

  2. 将 IAM 角色附加给现有 EC2 实例(最初没有 IAM 角色附加)

  3. 更换附加到 Amazon EC2 的 IAM 角色

  4. 移除附加到 Amazon EC2 的 IAM 角色


本文假设您具有创建 IAM 角色的权限,并具有调用 EC2 API 的权限。


AWS 命令行操作步骤中所有出现的占位符{Some Words},都应该替换为实际资源名称。


AWS 控制台操作步骤


  1. 打开 EC2 控制面板,并选择左侧边栏的“实例”。



  1. 选择您的实例,依次点击上方的操作->实例设置->Attach/Replace IAM role



  1. 打开 IAM role 下拉菜单,选择您想要附加给当前 EC2 的 IAM 角色,No Role 代表不附加角色,选好后点击右侧的 Apply 按钮。选择并应用的过程实际上包含了:将 IAM 角色附加给现有 EC2 实例(最初没有 IAM 角色附加);更换附加到 Amazon EC2 的 IAM 角色;移除附加到 Amazon EC2 的 IAM 角色。



  1. 如果您选择了 No Rule(即移除 EC2 上的 IAM 角色),会显示如下页面:



  1. 如果您未作出有效的修改,会显示如下页面:



  1. 如果您的修改有效,会显示如下页面:


AWS 命令行操作步骤

开始操作之前,请确保您的 CLI 版本大于等于 1.11.48。如果您对当前自己的 CLI 版本有疑问,可以在命令行中执行以下命令进行版本查询:


$aws --version



如果您已经有 pip 和支持的 Python 版本,则可以使用以下命令安装 AWS CLI:


# pip install --upgrade --user awscli

一、创建 IAM 角色

在从 AWS CLI 创建 IAM 角色之前,必须先创建角色信任策略。信任策略允许 AWS 服务(如 EC2)代表您的应用程序承担 IAM 角色。


要创建信任策略,请复制以下策略,并将其粘贴到使用名称{YourNewRole}-Trust-Policy.json 保存的文本文件中,注意后缀名为.json:


♦AWS 中国区


{


"Version": "2012-10-17",


"Statement": [


{


"Effect": "Allow",


"Principal": {


"Service": "ec2.amazonaws.com.cn"


},


"Action": "sts:AssumeRole"


}


]


}


♦AWS 全球


{


"Version": "2012-10-17",


"Statement": [


{


"Effect": "Allow",


"Principal": {


"Service": "ec2.amazonaws.com"


},


"Action": "sts:AssumeRole"


}


]


}


现在您已成功创建信任策略,接下来创建 IAM 角色{YourNewRole}:


  1. 基于信任策略创建 IAM 角色{ourNewRole},打开命令行并执行以下命令:


$aws iam create-role --role-name {YourNewRole} --assume-role–policy-document file://{FilePath}/{YourNewRole}-Trust-Policy.json


注意: file:// 不能省略,策略路径可以是当前相对路径也可以是全路径。


例如:


相对路径: file://TestRole-Trust-Policy.json


全路径:


Windows:file://C:/test/TestRole-Trust-Policy.json


Linux: file:///data/test/TestRole-Trust-Policy.json



  1. 给予此 IAM 角色访问帐户中资源的权限。在本示例中,我假设您的应用程序需要只读访问您帐户中的所有 Amazon S3 存储桶和存储桶中的对象。因此,您将使用 AmazonS3ReadOnlyAccess AWS 托管策略。有关 AWS 托管策略的详细信息,请参阅使用托管策略。在命令行中执行以下命令:


$aws iam attach-role-policy --role-name {YourNewRole} --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess



  1. 创建 IAM 实例配置文件{YourNewRole-Instance-Profile}。实例配置文件允许 EC2 将 IAM 角色{YourNewRole}传递给 EC2 实例。要了解更多信息,请参阅使用实例配置文件。在命令行中执行以下命令:


$aws iam create-instance-profile --instance-profile-name {YourNewRole-Instance-Profile}


$aws iam add-role-to-instance-profile --role-name {YourNewRole} --instance-profile-name {YourNewRole-Instance-Profile}


至此,您已成功创建 IAM 角色{YourNewRole}。

二、将 IAM 角色附加给现有 EC2 实例(最初没有 IAM 角色附加)

您现在可以将 IAM 角色{YourNewRole}附加到 EC2 实例{YourInstanceId}:


  1. 获取现有 EC2 实例详细信息(记录 InstanceId)。在命令行中执行以下命令:


$aws ec2 describe-instances


  1. 将新创建的 IAM 角色{YourNewRole}的实例配置文件{YourNewRole-Instance-Profile} 附加到您的 EC2 实例{YourInstanceId}。在命令行中执行以下命令:


$aws ec2 associate-iam-instance-profile --instance-id {YourInstanceId} --iam-instance-profile Name={YourNewRole-Instance-Profile}



  1. 验证 IAM 角色是否已附加到实例。在命令行中执行以下命令:


$aws ec2 describe-iam-instance-profile-associations



  1. 打开 AWS EC2 控制台,查看实例的描述信息:



  1. 进入 EC2 实例内,查看实例 IAM 角色具体信息:


$curl http://169.254.169.254/latest/meta-data/iam/security-credentials/{YourNewRole}



至此,您可以使用IAM角色访问AWS资源来更新应用程序,并把实例中的长期密钥删除。

三、更换附加到 Amazon EC2 的 IAM 角色

如果角色的使用需求发生改变,并且您希望通过修改 IAM 角色来授予 EC2 实例权限,则可以更换换附加到 EC2 的 IAM 角色。但是,这也将修改使用此 IAM 角色的其他 EC2 实例的权限。


可以采用调用 replace-iam-instance-profile-association 调用替换 IAM 角色命令, 将当前附加的 IAM 角色{YourNewRole}更换为另一个 IAM 角色{YourReplacementRole}(例如:EC2role2),而不终止您的 EC2 实例:


步骤:


  1. 创建新的 IAM 实例配置文件{YourReplacementRole-Instance-Profile}指向新的 IAM 角色{YourReplacementRole},例如 EC2Role。创建命令参考上节内容。

  2. 获取现有 EC2 实例 IAM 附加信息(记录 AssociationId)。在命令行中执行以下命令:


$aws ec2 describe-iam-instance-profile-associations


使用过滤条件和控制查询输出内容,获取指定 EC2 实例的


$aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-79dxxxx --query


'IamInstanceProfileAssociations[*].{InstanceId:InstanceId,AssociationId:AssociationId}' --output table



  1. 更换 IAM 角色。在命令行中执行以下命令:


$aws ec2 replace-iam-instance-profile-association --association-id {YourCurrentAssociationId}


--iam-instance-profile Name={YourReplacementRole-Instance-Profile}



  1. 根据 AssociationId 的值看出,IAM 角色的更改已生效。打开 AWS EC2 控制台,查看实例的描述信息:


四、移除附加到 Amazon EC2 的 IAM 角色

在实际使用过程中,您的 EC2 可能不再需要通过角色使用 AWS 资源。这时候您可以选择移除附加在 EC2 上的 IAM 角色。


可以采用调用 disassociate-iam-instance-profile 调用移除 IAM 角色命令:


步骤:


  1. 获取现有 EC2 实例 IAM 附加信息(记录 AssociationId)。获取 IAM 信息命令参考上一节所述

  2. 移除 IAM 角色。在命令行中执行以下命令:


$aws ec2 disassociate-iam-instance-profile --association-id {YourCurrentAssociationId }



  1. 根据第二次查询现有 EC2 实例 IAM 附加信息为空可以看出,当前实例的 IAM 角色已被移除。


而在上述所有操作的过程中,均未影响 EC2 的运行状态。

总结:

做为安全最佳实践,让我们现在就行动起来,将所有需要使用 AWS 资源的 Amazon EC2 上添加对应的角色。

参考

[1]New! Attach an AWS IAM Role to an Existing Amazon EC2 Instance by Using the AWS CLI


[2]AWS命令行参考手册


[3]Demo脚本下载


作者介绍:



王元恺


AWS 实习解决方案架构师,上海交通大学学生,有数年 C++程序开发以及一年 PHP 前后端开发经验,同时致力于 AWS 云服务在国内的应用和推广。熟悉网站架设与网络应用开发,对于 TCP/IP 及网络协议有自己的理解和实践经验。



陈琳涛


AWS 解决方案架构师。拥有超过 15 年的 IT 行业以及软件开发领域的工作经验。2000 年投身互联网大潮,创办过自己的公司。长期从事网络相关研发和管理工作,热爱 DevOps 实践。随后,投身游戏行业,参与多个项目的研发,运维,上线工作。致力于使用云计算来帮助更多的创业者迈向成功。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/using-aws-console-adding-iam-role-to-ec2-instance/


2019-11-18 08:001262

评论

发布
暂无评论
发现更多内容

【LeetCode】连续数组Java题解

Albert

算法 LeetCode 6月日更

react源码解析5.jsx&核心api

全栈潇晨

React React Hooks

超超超超级详细的多边形游戏问题分析(动态规划)

若尘

算法 动态规划 6月日更

【通俗易懂】JWT-使用的可能正确姿势

蛋先生DX

JWT 6月日更

【Flutter 专题】113 图解自定义 ACEPieWidget 饼状图 (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

记一次K8s排错实战

雪雷

k8s 6月日更

华云大咖说 | 安超OS全面升级 最新亮点解密

华云数据

C++多线程强制终止

华为云开发者联盟

c++ 安全 线程 多线程 可信

anyRTC Web SDK 实现音视频呼叫功能

anyRTC开发者

音视频 WebRTC RTC sdk

《开源 PassJava》1、项目介绍

悟空聊架构

开源 面试 刷题 spring cloud alibaba 6月日更

6000年,看懂了「硬核山东」!

云计算

C 语言数据结构的封装方法

实力程序员

ETL工程师必看!超实用的任务优化与断点执行方案

敏捷调度TASKCTL

大数据 ETL算法 ETL ETL任务 ETL系统

最近打算重新写一遍爬虫“指北”

IT蜗壳-Tango

IT蜗壳教学 6月日更

PMP-项目管理标准

索隆

pmp 6月日更

【Vue2.x 源码学习】第三篇 - 对象的单层劫持

Brave

源码 vue2 6月日更

有点难的知识点:Webpack Chunk 分包规则详解

范文杰

webpack 6月日更

分库分表 vs NewSQL 数据库

xcbeyond

分库分表 6月日更

详解浏览器跨域访问的几种办法

华为云开发者联盟

安全 浏览器 跨域 WEB安全 跨域访问

裕民银行 x mPaaS | 移动应用“适老化”改造,可不止是字体变大

蚂蚁集团移动开发平台 mPaaS

移动开发 mPaaS APP开发

🏆【声网Agora】「WebRTC-如何搭建语音认证服务」

码界西柚

WebRTC RTC征文大赛 Agora 6月日更

5分钟速读之Rust权威指南(十六)

wzx

rust

踩准时钟节拍、玩转时间转换,鸿蒙轻内核时间管理有妙招

华为云开发者联盟

鸿蒙 时间管理 计数器 时间转换 计时

Golang Testing 概览 - 基本篇

hedzr

Unit Test testing Go 语言

Dubbo 线程池模型

青年IT男

dubbo

傲腾持久内存如何为数据赋能,加速应用落地?

白玉兰开源

人工智能 英特尔 傲腾

如履薄冰--亚马逊直运系统重构实录

蔡超

软件架构 软件重构 软件自动化测试

音视频学习--弱网对抗技术相关实践

Fenngton

音视频 网络 视频编解码 弱网下的极限实时视频通信 实时视频

亮相Google I/O,字节跳动是这样应用Flutter的

字节跳动技术团队

ARTS--week 10 补打卡

steve_lee

5W1H聊开源之What——开源是什么?

禅道项目管理

开源 软件 开发

使用AWS控制台或命令行将AWS IAM角色附加到现有的Amazon EC2实例中_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章