24

Tôi đã tạo một thẻ trên bảng điều khiển AWS cho một trong các phiên bản EC2 của tôi.Cách đặt biến môi trường trong Amazon EC2

enter image description here

Tuy nhiên, khi tôi nhìn trên máy chủ, không có biến môi trường như vậy được thiết lập.

Điều tương tự cũng hoạt động với cây đậu đàn hồi. env hiển thị các thẻ tôi đã tạo trên bảng điều khiển.

$ env 
[...] 
DB_PORT=5432 

Làm cách nào để đặt biến môi trường trong Amazon EC2?

Trả lời

2

Làm theo hướng dẫn được đưa ra bởi Guy, tôi đã viết một tập lệnh shell nhỏ. Tập lệnh này sử dụng AWS CLI và jq. Nó cho phép bạn nhập khẩu thẻ AWS và thẻ AMI của bạn dưới dạng biến môi trường shell.

Tôi hy vọng nó có thể giúp một vài người.

https://github.com/12moons/ec2-tags-env

+0

Chỉ cần tạo phiên bản cải tiến của giải pháp được cung cấp ở trên tại https://gist.github.com/marcellodesales/a890b8ca240403187269 –

18

Bạn có thể truy xuất thông tin này từ dữ liệu meta và sau đó chạy các lệnh môi trường đã đặt của riêng bạn.

Bạn có thể lấy ví dụ-id từ dữ liệu meta (xem ở đây để biết chi tiết: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-retrieval)

curl http://169.254.169.254/latest/meta-data/instance-id 

Sau đó, bạn có thể gọi mô tả-thẻ bằng cách sử dụng cài đặt sẵn AWS CLI (hoặc cài đặt nó trên bạn AMI)

aws ec2 describe-tags --filters "Name=resource-id,Values=i-5f4e3d2a" "Name=Value,Values=DB_PORT" 

Sau đó, bạn có thể sử dụng hệ điều hành thiết lập biến môi trường lệnh

export DB_PORT=/what/you/got/from/the/previous/call 

Bạn có thể chạy tất cả những gì trong tập lệnh dữ liệu người dùng của mình. Xem tại đây để biết chi tiết: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html

+5

tôi khuyên bạn nên sử dụng một vai trò quan IAM ví dụ của bạn - điều này sẽ cho phép bạn thực hiện cuộc gọi API mà không chỉ định thông tin đăng nhập. Câu trả lời mà Guy đưa ra là chính xác những gì chúng tôi sử dụng trong sản xuất. –

+1

Cảm ơn câu trả lời của bạn. Tôi tạo ra một vai trò IAM cho phép 'ec2: DescribeTags' nhưng khi tôi thực thi' aws ec2 description-tags' tôi nhận được 'Lỗi máy khách (UnauthorizedOperation) xảy ra khi gọi thao tác DescribeTags: Bạn không được phép thực hiện thao tác này'. Tôi đang thiếu gì? –

+0

Ok, tôi phải thực hiện 'rm -rf .aws' và 'aws configure' (không cần nhập bất kỳ khóa API nào) để có aws đọc thông tin đăng nhập mới từ siêu dữ liệu cá thể. –

3

tôi đã sử dụng một sự kết hợp của các công cụ sau:

  • Cài đặt thư viện JQ (sudo apt-get install -y JQ)
  • Cài đặt Công cụ EC2 Instance Metadata Query

Dưới đây là ý chính của mã bên dưới trong trường hợp tôi cập nhật mã trong tương lai: https://gist.github.com/marcellodesales/a890b8ca240403187269

###### 
# Author: Marcello de Sales ([email protected]) 
# Description: Create Create Environment Variables in EC2 Hosts from EC2 Host Tags 
# 
### Requirements: 
# * Install jq library (sudo apt-get install -y jq) 
# * Install the EC2 Instance Metadata Query Tool (http://aws.amazon.com/code/1825) 
# 
### Installation: 
# * Add the Policy EC2:DescribeTags to a User 
# * aws configure 
# * Souce it to the user's ~/.profile that has permissions 
#### 
# REboot and verify the result of $(env). 

# Loads the Tags from the current instance 
getInstanceTags() { 
    # http://aws.amazon.com/code/1825 EC2 Instance Metadata Query Tool 
    INSTANCE_ID=$(./ec2-metadata | grep instance-id | awk '{print $2}') 

    # Describe the tags of this instance 
    aws ec2 describe-tags --region sa-east-1 --filters "Name=resource-id,Values=$INSTANCE_ID" 
} 

# Convert the tags to environment variables. 
# Based on https://github.com/berpj/ec2-tags-env/pull/1 
tags_to_env() { 
    tags=$1 

    for key in $(echo $tags | /usr/bin/jq -r ".[][].Key"); do 
     value=$(echo $tags | /usr/bin/jq -r ".[][] | select(.Key==\"$key\") | .Value") 
     key=$(echo $key | /usr/bin/tr '-' '_' | /usr/bin/tr '[:lower:]' '[:upper:]') 
     echo "Exporting $key=$value" 
     export $key="$value" 
    done 
} 

# Execute the commands 
instanceTags=$(getInstanceTags) 
tags_to_env "$instanceTags" 
0

Tôi thường tải thẻ dưới dạng biến môi trường khi khởi động bằng cách chạy tập lệnh UserData. Tùy thuộc vào cá thể, tôi thay đổi các tham số --query--filter thành cuộc gọi describe-instances nhưng nếu không thì tập lệnh sẽ giữ nguyên. LƯU Ý: Ví dụ bên dưới loại trừ thẻ Name và các thẻ có chứa : - thay đổi hành vi này cho phù hợp với nhu cầu của bạn.

#!/bin/bash -v 
apt-get update 
apt-get -y install awscli 

# add boot script which loads environment variables 
cat > /etc/profile.d/export_instance_tags.sh << 'EndOfMessage' 
# fetch instance info 
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) 
INSTANCE_AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone) 
INSTANCE_REGION="`echo \"$INSTANCE_AZ\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`" 

# export instance tags 
export_statement=$(aws ec2 describe-tags --region "$INSTANCE_REGION" --filters "Name=resource-id,Values=$INSTANCE_ID" --query 'Tags[?!contains(Key, `Name`) && !contains(Key, `:`)].[Key,Value]' --output text | sed -E 's/^([^\s\t]+)[\s\t]+([^\n]+)$/export \1="\2"/g') 
eval $export_statement 

# export instance info 
export INSTANCE_ID 
export INSTANCE_AZ 
export INSTANCE_REGION 
EndOfMessage 

Nó chạy describe-tags để liệt kê tất cả các thẻ, định dạng lại đầu ra vào một chuỗi các câu lệnh xuất khẩu với sed sau đó chạy kết quả sử dụng eval

Các vấn đề liên quan