首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当以编程方式从镜像启动新的亚马逊EC2时,如何传递环境变量?

当以编程方式从镜像启动新的亚马逊EC2时,如何传递环境变量?
EN

Stack Overflow用户
提问于 2012-03-31 05:21:53
回答 3查看 12.2K关注 0票数 23

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

EN

回答 3

Stack Overflow用户

发布于 2012-03-31 12:05:17

http://alestic.com/2009/06/ec2-user-data-scripts解释了如何使用用户数据执行此操作。有关使用Java的问题,请参阅AmazonEC2 launch with userdata

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

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

在对我进行了大量测试之后,将环境变量回显到/etc/environment中效果最好,如下所示:

代码语言:javascript
复制
 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''')

然后在登录时:

代码语言:javascript
复制
ubuntu@ip-10-190-81-29:~$ echo $foozle
barzle
票数 13
EN

Stack Overflow用户

发布于 2014-08-21 07:40:18

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

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

代码语言:javascript
复制
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::some-secure-bucket/*"
    }
  ]
}

然后,您可以将您的.env文件上传到该存储桶中(加密存储)。然后,要在EC2实例上访问它,您可以使用AWS cli工具:

代码语言:javascript
复制
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角色更改为以下内容:

代码语言:javascript
复制
{
  "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

代码语言:javascript
复制
sudo sed -i.dist 's,universe$,universe multiverse,' /etc/apt/sources.list
sudo apt-get update
sudo apt-get install -y ec2-api-tools

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

代码语言:javascript
复制
ec2-describe-tags --filter resource-id="$(ec2metadata --instance-id)" --filter "key=Name" | cut -f5

注意:我的bash很烂,所以我用ruby去掉了名字,但是如果你喜欢的话你可以用tr去掉换行符!

票数 8
EN

Stack Overflow用户

发布于 2013-01-16 20:46:09

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

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

代码语言:javascript
复制
GET http://169.254.169.254/latest/user-data

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9950586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档