Amazon ec2 从映像以编程方式启动新的AmazonEC2时,如何传递环境变量?

Amazon ec2 从映像以编程方式启动新的AmazonEC2时,如何传递环境变量?,amazon-ec2,amazon-web-services,ec2-ami,ec2-api-tools,Amazon Ec2,Amazon Web Services,Ec2 Ami,Ec2 Api Tools,我正在使用AWS Java API RunInstance()从我的自定义AMI映像启动一个新的EC2实例。如何将环境变量传递给新的EC2实例,如数据库url、AWS凭据等 说明如何使用用户数据执行此操作。有关使用Java的详细信息,请参阅 注意,我看到有人提到,这不适用于Windows,只适用于Unix [更新]此处有更多关于设置环境变量的数据: [经过大量测试]对我来说,将环境变量回传到/etc/environment中效果最好,如下所示: reservation = connection

我正在使用AWS Java API RunInstance()从我的自定义AMI映像启动一个新的EC2实例。如何将环境变量传递给新的EC2实例,如数据库url、AWS凭据等

说明如何使用用户数据执行此操作。有关使用Java的详细信息,请参阅

注意,我看到有人提到,这不适用于Windows,只适用于Unix

[更新]此处有更多关于设置环境变量的数据:

[经过大量测试]对我来说,将环境变量回传到/etc/environment中效果最好,如下所示:

 reservation = connection.run_instances(image_id = image_id,
  key_name = keypair,
  instance_type = 'm1.small',
  security_groups = ['default'],
  user_data = '''#!/bin/sh\necho export foozle=barzle >> /etc/environment\n''')
然后在登录时:

ubuntu@ip-10-190-81-29:~$ echo $foozle
barzle

您还可以使用实例元数据检索,如中所述

从上面的文档中,如果从实例中运行实例,则以下GET请求将检索实例的用户数据:

GET http://169.254.169.254/latest/user-data
ec2-describe-tags --filter resource-id="$(ec2metadata --instance-id)" --filter "key=Name" | cut -f5

这样,即使实例已经启动并运行,也可以动态检索用户数据。

免责声明:我不是系统管理员

我使用一个安全的S3存储桶,这意味着只有您正在启动的实例才能访问该存储桶。您可以设置如下所示的IAM角色:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::some-secure-bucket/*"
    }
  ]
}
然后,您可以将
.env
文件上载到该存储桶中(加密存储)。然后,要在EC2实例上访问它,可以使用AWS cli工具:

sudo apt-get install -y python-pip (for aws s3 CLI library)
sudo pip install awscli
aws s3 cp --region us-east-1 s3://some-secure-bucket/.some-dot-env-file output_file_path
您可以在代码运行时下拉此文件,也可以选择在启动时将前面提到的
cp
命令放在类似
/etc/init.d/download\u credentials.sh的init脚本中

我认为这是下载每个使用AMI的实例都需要的东西的一个非常好的选择,比如凭证。然而,如果您想指定每个实例的元数据,我只是使用我认为效果不错的标记来实现。要执行此操作,请使用以下内容更改上述IAM角色:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::some-secure-bucket/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeTags"
      ],
      "Resource": "*"
    }
  ]
}
然后安装
ec2 api工具

sudo sed -i.dist 's,universe$,universe multiverse,' /etc/apt/sources.list
sudo apt-get update
sudo apt-get install -y ec2-api-tools
现在,您应该能够通过标记获取每个实例的元数据,例如实例的“名称”:

GET http://169.254.169.254/latest/user-data
ec2-describe-tags --filter resource-id="$(ec2metadata --instance-id)" --filter "key=Name" | cut -f5

注意:我不喜欢bash,所以我在ruby中去掉了这个名字,但是如果你喜欢,你可以使用
tr
删除换行符

很好的解决方案,托尼。我最终做了类似的事情,但我将完整的
Instance Init.sh
脚本放在一个加密的桶中,并在实例化时将其拉入。我的实际
用户数据
脚本只是安装Python、pip和was cli,然后下载并运行'real'
实例Init.sh
脚本。你可以在这里看到我类似的问题:。但最大的问题是,这真的安全吗?好问题@AJB。如果我有这个问题,我会直接与AWS支持人员交谈,并与他们讨论“有多安全”,因为这才是真正的问题。我知道它对于我的用例来说“足够安全”。一个行动人员可能会深入了解更多细节。另一个不相关的注意事项是,我目前正在使用标记的“用户数据”实例,因为我发现从实例生命周期的角度来看,要管理标记是一件非常痛苦的事情