Amazon ec2 如何在cloud init中引用AWS访问密钥(密钥),而无需硬编码

Amazon ec2 如何在cloud init中引用AWS访问密钥(密钥),而无需硬编码,amazon-ec2,amazon-iam,Amazon Ec2,Amazon Iam,我想写一个初始化REX-Ray docker插件(一个在配置中使用AWS凭据的服务)的cloud init脚本。 我考虑过以下方法。然而,这些方法也有一些缺点 云初始化脚本中的硬代码访问密钥/密钥 问题:这是不安全的 创建IAM角色,然后从实例元数据中引用访问密钥、密钥 问题:访问密钥将在一段时间内过期。 所以我需要重新启动REX-Ray守护进程,这会导致服务暂时不可用 请告诉我引用访问密钥/密钥的更好方法,或者如果存在,请告诉我其他方法 提前感谢。您可以使用以下身份验证方法 环境变量 在环境中

我想写一个初始化REX-Ray docker插件(一个在配置中使用AWS凭据的服务)的cloud init脚本。 我考虑过以下方法。然而,这些方法也有一些缺点

  • 云初始化脚本中的硬代码访问密钥/密钥

    问题:这是不安全的

  • 创建IAM角色,然后从实例元数据中引用访问密钥、密钥

    问题:访问密钥将在一段时间内过期。 所以我需要重新启动REX-Ray守护进程,这会导致服务暂时不可用

  • 请告诉我引用访问密钥/密钥的更好方法,或者如果存在,请告诉我其他方法


    提前感谢。

    您可以使用以下身份验证方法

    环境变量

    在环境中导出访问密钥和密钥,如下所示:

    $ export AWS_ACCESS_KEY_ID="anaccesskey"
    $ export AWS_SECRET_ACCESS_KEY="asecretkey"
    
    共享凭证文件

    可以使用AWS凭据文件指定凭据。Linux和OS X上的默认位置为$HOME/.aws/credentials,Windows用户的默认位置为“%USERPROFILE%.aws\credentials”。如果terraform无法在线或在环境中检测凭据,terraform将检查此位置

    您可以选择在配置中指定不同的位置,方法是提供共享的\u凭证\u文件属性,如下所示

    provider "aws" {
      region                  = "us-west-2"
      shared_credentials_file = "/Users/tf_user/.aws/creds"
      profile                 = "customprofile"
    }
    

    docker插件应自动获取凭据。你什么都不用做。不要为AWS凭据设置任何环境变量


    AWS CLI
    /
    AWS SDK
    将自动从元数据服务器获取凭据。

    为什么说IAM角色的访问密钥过期?很抱歉,我的英语不好。在上面(2)中,我想从实例元数据(例如“”)中访问密钥/密钥。根据下面的文档,返回的凭证在“到期”字段过期。docker插件应该自动获取凭证。你什么都不用做。插件是否使用AWS CLI或任何AWS SDK?它是用什么写的?Docker插件(rexray volume plugin)是用golang写的,AWS凭证通过环境变量或REX-Ray的配置文件传递。为了从实例元数据url获取凭据,插件需要知道“IAM角色名”。但是,没有与“IAM角色名称”对应的字段。所以我认为rexray插件不关心凭据过期。正如您所说,我认为凭据过期也应该关注插件方面。不要为AWS凭据设置任何环境变量。它应该会起作用。脚本将自动从元数据服务器获取凭据。你能试试吗?谢谢你的回复。为了定义环境变量或使用“~/.aws/credentials”文件,我认为需要在启动时创建一个文件或定义环境变量。但是,要在启动时创建文件(例如“~/.aws/credentials”)文件或定义环境变量(例如aws\u SECRET\u ACCESS\u KEY),需要准备cloud init脚本(或shell脚本)和硬代码值,例如SECRET KEY(似乎不安全)。所以我想知道,如果存在硬编码凭证(Terraform可以很好地处理这个问题?),如何避免硬编码凭证。是的,您可以使用EC2角色(这是推荐的方法)。只需创建一个IAM角色并将其附加到您的实例即可。Terraform每次运行时都会向元数据API端点询问凭据。但是请注意,凭证是旋转的,但是terraform每次需要运行时都会得到一个新的凭证。这是如何为EC2创建IAM角色谢谢你的建议,我知道即使EC2角色的访问密钥/密钥(通过实例元数据)已过期,AWS SDK(Docker插件在内部使用)也会关注其生命周期。所以我们不需要关心凭证的生命周期(这是推荐的方式)。正如您所说,我已经确认访问密钥/密钥已过期并自动刷新,然后rexray守护进程(docker插件)仍然可以访问EBS卷。我知道AWS API客户端(docker插件)负责凭证的生命周期,所以我们不需要关心它。我将接受此方法来管理凭据。谢谢你的建议。