写点什么

使用 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:001207

评论

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

悖论和直觉

阳龙生

蚂蚁金服三面Java面试题全解析,这也太难了吧

Java架构之路

Java 程序员 架构 面试 编程语言

redis+docker构建主从环境

小铨

redis Docker redis+docker 主从环境

mysql实现主主数据库(双机热备)

大奎

区块链如何助力中小企业解决融资难题

CECBC

区块链

2021年GitHub上爆火的999页Java面试宝典终开源

比伯

Java 编程 架构 面试 程序人生

监控系统-zabbix快速入门

小铨

监控 zabbix

MySQL-技术专题-知识点介绍

码界西柚

MySQL

Vue3源码 | 如何挂载组件元素?

梁龙先森

源码分析 大前端 Vue3

软件工程笔记:学习方法

风翱

软件工程 笔记 3月日更

如何实现一个简易版的 Spring - 如何实现 Setter 注入

mghio

spring 依赖注入

架构师知识笔记1

felix徐

架构实战营

Java-技术专题-Synchronized和lock区别

码界西柚

Java

数据库与缓存的一致性方案演进

邱学喆

缓存 一致性

小鼎机器人系统开发功能及源码

系统开发咨询1357O98O718

Kubernetes 弃用 Docker 后如何切换到 Containerd

倪朋飞

Docker Kubernetes 微服务

管理者如何才能不亲力亲为?

石云升

项目管理 28天写作 职场经验 管理经验 3月日更

牛链NB系统开发案例源码

系统开发咨询1357O98O718

Python OpenCV 图像旋转,取经之旅第 11 天

梦想橡皮擦

3月日更

周小川:数字货币将是下一代货币研究工作的核心

CECBC

数字货币

一束光的旅程

脑极体

字节跳动5面喜提offer!分享给朋友们面试感受

Java架构之路

Java 程序员 架构 面试 编程语言

AWS CDK的那些事

小铨

AWS AWS CDK

渣硕试水字节跳动,本以为简历都过不了,123+HR面直接拿到意向书

Java 编程 程序员 架构 面试

Kubernetes Ingress 可视化编辑器

倪朋飞

Kubernetes 网络

使用雪花 id 或 uuid 作为 MySQL 主键,被老板怼了一顿!

Java小咖秀

MySQL 数据库 雪花算法 uuid 雪花id

K8s各节点常用命令

happlyfox

学习 k8s 3月日更

爽啊,终于又见面了,字节跳动后端社招面试分享

Java架构之路

Java 程序员 架构 面试 编程语言

MySQL-技术专题-使用规范

码界西柚

MySQL

Java-技术专题-ConcurrentHashMap读操作分析

码界西柚

Java ConcurrentHashMap

区块链通证经济——资产流动性的变革

CECBC

资产流动性

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