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

use*_*116 21 amazon-ec2 amazon-web-services ec2-ami ec2-api-tools

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

jco*_*ctx 12

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''')
Run Code Online (Sandbox Code Playgroud)

然后登录时:

ubuntu@ip-10-190-81-29:~$ echo $foozle
barzle
Run Code Online (Sandbox Code Playgroud)


Ton*_*ony 7

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

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

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::some-secure-bucket/*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以.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
Run Code Online (Sandbox Code Playgroud)

您可以在代码运行时将此文件拉下来,或者通过将上述cp命令放在位于某个位置的init脚本中,可选择使其在启动时启动/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": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

然后安装 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
Run Code Online (Sandbox Code Playgroud)

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

ec2-describe-tags --filter resource-id="$(ec2metadata --instance-id)" --filter "key=Name" | cut -f5
Run Code Online (Sandbox Code Playgroud)

注意:我在bash上吮吸所以我在ruby tr中删除了这个名字,但如果你进入它,你可以用它来删除换行符!


A. *_*edy 5

您还可以使用实例元数据检索,如https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html中所述

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

GET http://169.254.169.254/latest/user-data
Run Code Online (Sandbox Code Playgroud)

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