23

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

4

3 回答 3

13

http://alestic.com/2009/06/ec2-user-data-scripts解释了如何使用用户数据来做到这一点。有关使用 Java 的问题,请参阅使用 userdata 启动 AmazonEC2

请注意,我已经看到提到这不适用于 Windows,仅适用于 Unix。

[更新] 此处设置环境变量的更多数据:https ://forums.aws.amazon.com/message.jspa?messageID=139744

[经过大量测试]对我来说,将环境变量回显到 /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
于 2012-03-31T04:05:16.970 回答
8

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

我使用安全 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_credentials.sh

我认为这是下载使用 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-tools

sudo sed -i.dist 's,universe$,universe multiverse,' /etc/apt/sources.list
sudo apt-get update
sudo apt-get install -y ec2-api-tools

现在您应该能够通过标签获取每个实例的元数据,例如实例的“名称”:

ec2-describe-tags --filter resource-id="$(ec2metadata --instance-id)" --filter "key=Name" | cut -f5

注意:我很讨厌 bash,所以我在 ruby​​ 中删除了名称,但tr如果你喜欢它,你可以使用它来删除换行符!

于 2014-08-20T23:40:18.390 回答
5

您还可以按照https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html中的说明使用实例元数据检索

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

GET http://169.254.169.254/latest/user-data

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

于 2013-01-16T12:46:09.347 回答