产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

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

评论

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

我是合适的人选么?

escray

学习 面试

MySQL系列(一):MySQL深入学习先导篇之基础架构

z小赵

MySQL 数据库

再见C++

Sunny.

c++ 踩坑

Centos7下service配置知识

【Elasticsearch 技术分享】—— Elasticsearch ?倒排索引?这都是什么?

程序员小航

elasticsearch ELK 倒排索引 ES 技术分享

对于结果不同程度的追求,决定了这个人的身价

非著名程序员

程序员 个人成长 思维模型 结果思维

一个@Transaction哪里来这么多坑?

程序员DMZ

spring 事务 读写分离

联邦学习初识

soolaugust

学习

性能全开的十代酷睿,造就惠普光影精灵 6 的电竞燃魂

最新动态

公司想要大龄程序员么?

escray

学习 面试

Docker 的前世今生

哈喽沃德先生

Docker 容器 微服务 虚拟化

终于可以职业规划了么?

escray

学习 面试

大数据技术发展(三):Spark 代替 Hadoop ? Spark Or Flink ?

cristal

Java 大数据 flink hadoop spark

SpreadJS 应用案例:电力自动化在线数据采集报表系统

葡萄城技术团队

SpreadJS 电力 报表

a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站…z站?

程序员生活志

Week 11命题作业

Jeremy

四十不惑,准备面试

escray

学习 面试

我以后去做什么,技术还是业务?

escray

学习 面试 职业规划

【API进阶之路】逆袭!用关键词抽取API搞定用户需求洞察

华为云开发者联盟

接口 软件开发 API 华为云 API Explorer平台

我喜欢的工作,喜欢我么?

escray

学习 面试

星火PLUS交易所打造无边界数字经济联盟,掀起币圈追捧热潮

InfoQ_967a83c6d0d7

3 分钟生成一个单元测试报告,这个样式爱了

程序员小富

Java 测试

Flink的2种部署模式-2

小知识点

scala 大数据 flink

究竟要找什么样的工作?

escray

学习 面试

一看就懂的三次握手

书旅

TCP 三次握手 操作系统 协议族

一文读懂jar包的小秘密

程序那些事

Java jar jar包的小秘密 java解密

简单交互式页面的思考(C)

Alex

指针 C语言 交互设计

搞一搞Elasticsearch

北漂码农有话说

Week 11 学习总结

Jeremy

如何通过技术面试?

escray

学习 面试

如何使 Grafana as code

郭旭东

翻译 Grafana

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