我需要构建一个具有特定标题、我的名字以及实例本身的以下元数据的 html:实例 ID、可用区、私有 IPv4 地址和子网 ID。
我必须通过 ssh 到实例来将该程序托管在 docker 存储库中。
我认为一切正常,但是在 bash 中执行一些命令并最终运行程序后,它被卡住了。
这是Python程序:
from flask import Flask
from ec2_metadata import ec2_metadata
app = Flask(__name__)
@app.route('/')
def get_instance_metadata():
instance_id = ec2_metadata.instance_id
availability_zone = ec2_metadata.availability_zone
private_ip = ec2_metadata.private_ipv4
subnet_id = ec2_metadata.network_interfaces[ec2_metadata.mac]['subnet-id']
return f"""
<html>
<body>
<h1>EC2 Metadata</h1>
<p><strong>Instance ID:</strong> {instance_id}</p>
<p><strong>Availability Zone:</strong> {availability_zone}</p>
<p><strong>Private IP:</strong> {private_ip}</p>
<p><strong>Subnet ID:</strong> {subnet_id}</p>
</body>
</html>
"""
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
这是我在 bash 中遵循的步骤,直到出现上述错误为止
sudo yum update
sudo yum install docker
sudo systemctl start docker
sudo systemctl enable docker
sudo systemctl status docker
mkdir flask_docker
nano flask_docker/app.py
nano flask_docker/requirements.txt
# the requirements are:
# Flask==1.1.2
# Werkzeug==1.0.1
# Jinja2==2.11.3
# MarkupSafe==1.1.1
# itsdangerous==1.1.0
# click==7.1.2
# ec2-metadata==0.13
# requests==2.26.0
nano flask_docker/Dockerfile
# inside this file I did this:
# syntax=docker/dockerfile:1.4
# FROM python:3.8-alpine
# WORKDIR /app
# COPY requirements.txt requirements.txt
# RUN pip3 install -r requirements.txt
# COPY . .
# CMD ["python3", "app.py"]
sudo docker build -t flask_container .
sudo docker images
sudo docker run -p 5000:5000 -d flask_container
sudo docker ps
netstat -tulnp
curl http://127.0.0.1:5000
# HERE IS WHERE I FOUND THE PROBLEM
您可以分享 ec2_metadata 代码吗? 根据该问题,可能存在核心逻辑错误,或者您的 EC2 实例正在使用 IMDSv2,而代码可能尝试使用 IMDSv1 方法获取元数据。