Terraform 助力 ECS 实例借助 RAM 管理阿里云产品

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000 次 1年
简介: ECS 实例借助于 RAM Role 可以帮助实例内部应用程序实现对阿里云产品的轻松访问和管理,Terraform 可实现对 RAM Role,Policy,ECS 实例以及其他资源的统一管理和平滑扩容,以降低整个运维流程的复杂度。

众所周知,不论以怎样的方式访问阿里云产品的 API,拥有账号完整权限的密钥AK(Access Key ID 和 Access Key Secret,简称 AK)是必不可少的参数。因此,对 AK 的有效管理是每个调用阿里云 API 的应用程序首先需要解决的问题。

对于部署在 ECS 实例上的应用程序而言,为了方便对 AK 的管理,通常需要将 AK 保存在应用程序的配置文件中或 ECS 实例的环境变量中,如此一来,无疑增加了 AK 管理的复杂性,降低了 AK 的安全性和灵活性。除此之外,对于多 Region 一致性部署应用的场景而言,AK 往往会随着镜像以及基于镜像创建的实例扩散出去,此时,将不得不更新镜像和逐台重新部署实例,从而应用部署的复杂度也将随之增加。

面对以上困境,我们可借助于 RAM 角色功能,将 RAM 角色 和 ECS 实例关联起来,使得实例内部的应用程序可以通过 STS 临时凭证(由系统自动生成和更新,详见 RAM And STS)访问其他云产品的 API。应用程序无需管理 STS 临时凭证,直接通过实例元数据 URL 即可获取。同时,通过对 RAM 角色和授权策略的管理,可以达到不同实例对不同云产品或相同云产品具有各自访问权限的目的。

值得注意的是,每个 RAM 角色可同时被授权多个策略,通常我们的做法是为某一角色逐个授权相应的策略,同时,对于已有的 ECS 实例,我们需要逐台绑定某一角色,如何实现对 RAM 角色的自动化管理,授权策略的灵活设置以及为角色批量绑定 ECS 实例呢?本文将借助于自动化运维工具 Terraform 给出最佳的实践方案。

image

正如上图所示,基于 Terraform 实现了 RAM Role,Policy以及 ECS 实例的创建,为 Role 配置 Policy,并将配置后的 Role 挂载到 ECS 实例上,进而帮助实例上的应用程序访问阿里云的其他云服务。

本文将以 ECS 实例借助于 RAM 角色访问 OSS 服务为例,向大家展示如何基于 Terraform 实现从 RAM 角色的创建,授权策略的设置到ECS 实例的绑定以及如何在绑定了 RAM 角色的 ECS 实例上利用 Python 访问 OSS 服务的。

定义 RAM 角色

首先编写 Terraform 模板,定义 RAM Role:

resource "alicloud_ram_role" "role" {
    name = "EcsRamRoleTest"
    services = ["ecs.aliyuncs.com"]
    description = "Test role for ECS and access to OSS."
    force = true
}
AI 代码解读

模板定义了一个 RAM Role:EcsRamRoleTest,并为该角色配置了一个受信云服务 ECS,表示该角色为一个服务角色,受信云服务 ECS 可以扮演该角色。其中,设置 force = true 表示在通过 Terraform 释放该 Role 时会强制解除与该 Role 相关联的所有关系。

定义 RAM 授权策略

接下来在模板中定义 RAM Policy:

resource "alicloud_ram_policy" "policy" {
      name = "EcsRamRolePolicyTest"
      statement = [
          {
           effect = "Allow"
           action = ["oss:Get*", "oss:List*"]
           resource = [ "*" ]
         }
     ]
      description = "Test role policy for ECS and access to OSS."
      force = true
}
AI 代码解读

模板定义了一个自定义的授权策略 EcsRamRoleTest,并为该 Policy 中声明了 OSS 只读权限的策略。和 RAM Role 类似,设置 force = true 表示在通过 Terraform 释放该 Policy 时会强制解除与该 Policy 相关联的所有关系。

为 RAM 角色授权策略

在定义好 RAM Role 和 Policy 之后,接下来需要将 Policy 跟 Role 进行绑定,为 Role 进行策略授权:

resource "alicloud_ram_role_policy_attachment" "role-policy" {
    policy_name = "${alicloud_ram_policy.policy.name}"
    role_name = "${alicloud_ram_role.role.name}"
    policy_type = "${alicloud_ram_policy.policy.type}"
}
AI 代码解读

模板利用将创建好的 Policy 绑定到 Role 上,使得 Role 具有访问某种云产品服务的权限。

定义 ECS 实例

接下来基于 Terraform 创建一个 ECS 实例,用来绑定 Role 和部署应用:

resource "alicloud_vpc" "vpc" {
     name = "vpc_for_ecs_role"
     cidr_block = "172.16.0.0/12"
}

resource "alicloud_vswitch" "vswitch" {
    name = "subnet_for_ecs_role"
     vpc_id = "${alicloud_vpc.vpc.id}"
     cidr_block = "172.16.0.0/21"
     availability_zone = "cn-beijing-a"
}

resource "alicloud_security_group" "sg" {
    name = "sg_for_ecs_role"
    vpc_id = "${alicloud_vpc.vpc.id}"
}

resource "alicloud_security_group_rule" "22_rule" {
    security_group_id = "${alicloud_security_group.sg.id}"
    type = "ingress"
    policy = "accept"
    port_range = "22/22"
    ip_protocol = "tcp"
    nic_type = "intranet"
    priority = 1
    cidr_ip = "0.0.0.0/0"
}

resource "alicloud_instance" "instance" {
    # cn-beijing
    vswitch_id = "${alicloud_vswitch.vswitch.id}"
    image_id = "ubuntu_140405_32_40G_cloudinit_20161115.vhd"
    availability_zone = "cn-beijing-a"

    # series III
    instance_type = "ecs.n4.large"
    system_disk_category = "cloud_efficiency"

    internet_charge_type = "PayByTraffic"
    internet_max_bandwidth_out = 20
    allocate_public_ip = true
    security_groups = ["${alicloud_security_group.sg.id}"]
    instance_name = "instance_for_role"
    password = "Test12345"
}
AI 代码解读

因为 ECS 实例 RAM 角色目前只支持 VPC 网络的实例,所以模板创建了一个 VPC 环境下的 ECS Instance,实例的镜像是 ubuntu_140405_32_40G_cloudinit_20161115.vhd, 规格是ecs.n4.large,通过allocate_public_ip = true为该实例分配了公网 IP,并为其设置了 20M 的带宽。 在创建 instance 的同时,还新建了 VPC, VSwitch 和安全组资源。为了可以远程连接 ECS 实例,为安全组创建了入方向的安全组规则,打开了 SSH 协议需要的 22 端口。

为 ECS 实例配置 RAM 角色

在完成 ECS 实例的创建和 RAM Role 的配置之后,接下来需要将 RAM Role 和 ECS 实例进行绑定,以帮助实例上的应用可以直接访问其他云资源:

resource "alicloud_ram_role_attachment" "attach" {
    role_name = "${alicloud_ram_role.role.name}"
    instance_ids = ["${alicloud_instance.instance.*.id}"]
}
AI 代码解读

定义 OSS Bucket

为了更好的测试结果,我们可通过 Terraform 新建一个 OSS Bucket,并为该 Bucket 上传两个 Object:

resource "alicloud_oss_bucket" "bucket" {
    bucket = "my-bucket-for-ram-role-test"
    acl = "public-read"
}

resource "alicloud_oss_bucket_object" "content-1" {
    bucket = "${alicloud_oss_bucket.bucket.bucket}"
    key = "object-content-key-1"
    content = "some words for test oss object content 1."
}

resource "alicloud_oss_bucket_object" "content-2" {
    bucket = "${alicloud_oss_bucket.bucket.bucket}"
    key = "object-content-key-2"
    content = "some words for test oss object content 2."
}
AI 代码解读

如上所示,模板定义了一个 OSS Bucket:"my-bucket-for-ram-role-test" 和两个 OSS Object,分别为:"object-content-key-1" 和 "object-content-key-2".

访问 ECS 实例并测试

接下来,我们登录到 ECS 实例上借助于 Python 访问 OSS 服务来测试 Role 以及 Policy 生效。具体步骤如下:

  1. 远程连接 ECS 实例
  2. 获取 STS 临时凭证
    访问 http://100.100.100.200/latest/meta-data/ram/security-credentials/<RAM-Role-Name> 即可获取 STS 临时凭证,其中 <RAM-Role-Name> 表示 RAM 角色名称,在这里我们将其设置为 “EcsRamRoleTest”。
    运行结果如下:

    root@iZ2XXXXXXXXX:~# curl http://100.100.100.200/latest/meta-data/ram/security-credentials/EcsRamRoleTest
     {
      "AccessKeyId" : "STS.LS6XXXXXXXXXXXXXXXXuW",
      "AccessKeySecret" : "HCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXeAm",
      "Expiration" : "2017-08-18T13:17:39Z",
      "SecurityToken" : "CAIXXXXXXXXXXXXXXXXqq/etTxxxxxxxxxxxx6Mv/lXXXXXXXXXGW1",
      "LastUpdated" : "2017-08-18T07:17:39Z",
      "Code" : "Success"
    }
    
    AI 代码解读

    结果显示,我们使用了 curl 命令成功地获取到了 STS 凭证,由此表明 RAM Role 已经与 ECS 实例绑定成功。

  3. 基于临时凭证,使用 Python SDK 访问 OSS
    本示例中,我们基于 STS 临时凭证使用 Python SDK 列举实例所在地域的 OSS Bucket 里的 2 个对象。具体测试步骤如下:

    • 执行如下命令,安装 OSS Python SDK

      $ sudo pip install oss2
      AI 代码解读
    • 执行下述命令进行测试,其中:

      • oss2.StsAuth 中的 3 个参数分别对应于上述 STS 里的 AccessKeyId、AccessKeySecret 和 SecurityToken。
      • oss2.Bucket 中后 2 个参数是 Bucket 的名称和 Endpoint。本示例中,Bucket 名称为 my-bucket-for-ram-role-test,Endpoint 为 oss-cn-beijing.aliyuncs.com

      示例输出结果如下:

          
      root@iZ2XXXXXXXXX:~# python
      Python 2.7.6 (default, Oct 26 2016, 20:32:47) 
      [GCC 4.8.4] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import oss2
      >>> from itertools import islice
      >>> auth = oss2.StsAuth("STS.LS6XXXXXXXXXXXXXXXXuW", "HCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXeAm", "CAIXXXXXXXXXXXXXXXXqq/etTxxxxxxxxxxxx6Mv/lXXXXXXXXXGW1")
      >>> bucket = oss2.Bucket(auth, "oss-cn-beijing.aliyuncs.com", "my-bucket-for-ram-role-test")
      >>> for b in islice(oss2.ObjectIterator(bucket), 2):
      ...     print(b.key)
      ... 
      object-content-key-1
      object-content-key-2
      >>> 
      
      AI 代码解读

以上的运行结果显示,将 RAM Role 与 ECS 实例成功绑定后,ECS 实例可利用 STS 临时凭证成功地实现对 OSS 服务的访问,由此验证了整个运行流程的正确性。

写在最后

本文借助 RAM 角色访问云服务的功能,基于 Terraform 向大家展示了如何快速的实现 RAM 角色的创建,授权策略的设置,ECS 实例的创建以及绑定 RAM Role 等一系列操作,并通过测试验证了整个流程的有效性。

作为一个自动化运维工具,Terraform 的出现大大降低了资源编排的复杂度,简化了基础设施资源及其环境的搭建流程,同时对资源模板的版本化管理更是为基础设施资源的持续管理提供了方案,正如本文所展示的,当我们需要使用 OSS 的其他权限,或者访问其他云产品,或者让更多的 ECS 实例具有同样的权限的时候,只需要对如上的模板做一些适当的变更,如为 Policy 设置更多更丰富的 "statement",在 alicloud_instance 中设置 "count" 参数实现对 ECS 实例的平滑扩容等,然后只需运行一条简单的命令terraform apply 即可实现对原资源的快速升级和变更,省时又省力。

目前,面向阿里云的 Terraform Provider 仍在不断的发展和完善中,欢迎大家使用和提供宝贵的意见和建议。以下是相关参考资料,欢迎大家查阅。

Terraform Provider Github 地址https://github.com/alibaba/terraform-provider
Terraform Provider Document:Github: https://github.com/alibaba/terraform-provider-docs
Terraform Provider Packagehttps://github.com/alibaba/terraform-provider/releases
ECS 实例元数据获取 STS 临时凭证指南: https://www.alibabacloud.com/help/zh/doc-detail/49122.htm?spm=a3c0i.o54579zh.a3.7.4131bb5bwgOONE

备注:本文所涉及到的模板,可通过附件下载和使用,或者可直接访问ecs-ram-role-examplehttps://github.com/alibaba/terraform-provider/tree/master/terraform/examples/alicloud-ecs-ram-role 进行查看。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
78443
分享
相关文章
加速阿里云部署:Terraform在甄云科技的深度应用
甄云科技是一家领先的数字化采购平台服务商,通过Terraform实现全球云基础设施的高效管理与快速部署。公司成立于2017年,已服务全球30多个行业的中大型企业,客户遍布20多个国家和地区。利用IaC(基础架构即代码)理念和Terraform工具,甄云科技显著提升了开发与运维效率,减少了人为错误,加快了迭代速度,并支持业务快速扩展,为全球化战略提供了稳固的云基础架构支持。未来,公司将持续优化技术框架,回馈社区,助力更多企业的数字化转型。
阿里云云效产品使用问题之钉钉绑定主帐号和RAM 有什么区别么
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
印刷文字识别产品使用合集之如何创建RAM用户和阿里云账号的访问密钥
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
Linux服务器如何管理sshd的连接
【6月更文挑战第6天】Linux服务器如何管理sshd的连接
89 4
带你读《从基础到应用云上安全航行指南》——干货长文快收藏!阿里云专家教你如何安全访问和管理ECS资源(3)
**《从基础到应用云上安全航行指南》——阿里云专家教你如何安全访问和管理ECS资源(3)** 在阿里云的广阔云海中,ECS(弹性计算服务)资源如同航行的船只,承载着我们的业务与数据。如何确保这些
可观测性体系问题之ECS管控对其所有日志的管理如何解决
可观测性体系问题之ECS管控对其所有日志的管理如何解决
93 0
【阿里云弹性计算】阿里云 ECS 与 Kubernetes 集成:轻松管理容器化应用
【5月更文挑战第28天】阿里云ECS与Kubernetes集成,打造强大容器管理平台,简化应用部署,实现弹性扩展和高效资源管理。通过Kubernetes声明式配置在ECS上快速部署,适用于微服务和大规模Web应用。结合监控服务确保安全与性能,未来将深化集成,满足更多业务需求,引领容器化应用管理新趋势。
348 2

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问