Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Melayani lalu lintas masuk
Anda dapat memantau atau men-debug aplikasi secara lokal dengan menjalankan server HTTP di samping kode aplikasi Anda. Untuk melayani lalu lintas eksternal, Anda memetakan port di AWS Panorama Appliance ke port pada wadah aplikasi Anda.
penting
Secara default, AWS Panorama Appliance tidak menerima lalu lintas masuk pada port apa pun. Membuka port pada alat memiliki risiko keamanan implisit. Saat Anda menggunakan fitur ini, Anda harus mengambil langkah tambahan untuk mengamankan alat Anda dari lalu lintas eksternal dan mengamankan komunikasi antara klien resmi dan alat.
Kode contoh yang disertakan dengan panduan ini adalah untuk tujuan demonstrasi dan tidak menerapkan otentikasi, otorisasi, atau enkripsi.
Anda dapat membuka port dalam kisaran 8000—9000 pada alat. Port ini, ketika dibuka, dapat menerima lalu lintas dari klien yang dapat dirutekan. Saat menerapkan aplikasi, Anda menentukan port mana yang akan dibuka, dan memetakan port pada alat ke port pada wadah aplikasi Anda. Perangkat lunak alat meneruskan lalu lintas ke wadah, dan mengirimkan tanggapan kembali ke pemohon. Permintaan diterima di port alat yang Anda tentukan dan respons keluar pada port singkat acak.
Mengkonfigurasi port masuk
Anda menentukan pemetaan port di tiga tempat dalam konfigurasi aplikasi Anda. Paket kodepackage.json
, Anda menentukan port yang simpul kode mendengarkan di dalam network
blok. Contoh berikut menyatakan bahwa node mendengarkan pada port 80.
contoh Paket/123456789012-DEBUG_SERVER-1.0/package.json
"outputs": [
{
"description": "Video stream output",
"name": "video_out",
"type": "media"
}
],
"network": {
"inboundPorts": [
{
"port": 80,
"description": "http"
}
]
}
Dalam manifes aplikasi, Anda mendeklarasikan aturan perutean yang memetakan port pada alat ke port pada wadah kode aplikasi. Contoh berikut menambahkan aturan yang memetakan port 8080 pada perangkat ke port 80 pada code_node
wadah.
contoh graphs/my-app/graph.json
{
"producer": "model_input_width",
"consumer": "code_node.model_input_width"
},
{
"producer": "model_input_order",
"consumer": "code_node.model_input_order"
}
],
"networkRoutingRules": [
{
"node": "code_node",
"containerPort": 80,
"hostPort": 8080,
"decorator": {
"title": "Listener port 8080",
"description": "Container monitoring and debug."
}
}
]
Saat menerapkan aplikasi, Anda menentukan aturan yang sama di konsol AWS Panorama, atau dengan dokumen penggantian yang diteruskan ke API. CreateApplicationInstance Anda harus menyediakan konfigurasi ini pada waktu penerapan untuk mengonfirmasi bahwa Anda ingin membuka port pada alat.
contoh graphs/my-app/override.json
{
"replace": "camera_node",
"with": [
{
"name": "exterior-north"
}
]
}
],
"networkRoutingRules":[
{
"node": "code_node",
"containerPort": 80,
"hostPort": 8080
}
]
,
"envelopeVersion": "2021-01-01"
}
}
Jika port perangkat yang ditentukan dalam manifes aplikasi digunakan oleh aplikasi lain, Anda dapat menggunakan dokumen override untuk memilih port yang berbeda.
Melayani lalu lintas
Dengan port terbuka pada wadah, Anda dapat membuka soket atau menjalankan server untuk menangani permintaan yang masuk. debug-server
Sampel menunjukkan implementasi dasar dari server HTTP yang berjalan bersama kode aplikasi visi komputer.
penting
Implementasi sampel tidak aman untuk penggunaan produksi. Untuk menghindari membuat alat Anda rentan terhadap serangan, Anda harus menerapkan kontrol keamanan yang sesuai dalam kode dan konfigurasi jaringan Anda.
contoh Paket/123456789012-DEBUG_SERVER-1.0/Application.py — Server HTTP
# HTTP debug server
def run_debugger(self):
"""Process debug commands from local network."""
class ServerHandler(SimpleHTTPRequestHandler):
# Store reference to application
application = self
# Get status
def do_GET(self):
"""Process GET requests."""
logger.info('Get request to {}'.format(self.path))
if self.path == '/status':
self.send_200('OK')
else:
self.send_error(400)
# Restart application
def do_POST(self):
"""Process POST requests."""
logger.info('Post request to {}'.format(self.path))
if self.path == '/restart':
self.send_200('OK')
ServerHandler.application.stop()
else:
self.send_error(400)
# Send response
def send_200(self, msg):
"""Send 200 (success) response with message."""
self.send_response(200)
self.send_header('Content-Type', 'text/plain')
self.end_headers()
self.wfile.write(msg.encode('utf-8'))
try:
# Run HTTP server
self.server = HTTPServer(("", self.CONTAINER_PORT), ServerHandler)
self.server.serve_forever(1)
# Server shut down by run_cv loop
logger.info("EXITING SERVER THREAD")
except:
logger.exception('Exception on server thread.')
Server menerima permintaan GET di /status
jalur untuk mengambil beberapa informasi tentang aplikasi. Ini juga menerima permintaan POST /restart
untuk me-restart aplikasi.
Untuk mendemonstrasikan fungsionalitas ini, aplikasi sampel menjalankan klien HTTP pada utas terpisah. Klien memanggil /status
jalur melalui jaringan lokal segera setelah startup, dan memulai ulang aplikasi beberapa menit kemudian.
contoh Paket/123456789012-DEBUG_SERVER-1.0/Application.py - klien HTTP
# HTTP test client
def run_client(self):
"""Send HTTP requests to device port to demnostrate debug server functions."""
def client_get():
"""Get container status"""
r = requests.get('http://{}:{}/status'.format(self.device_ip, self.DEVICE_PORT))
logger.info('Response: {}'.format(r.text))
return
def client_post():
"""Restart application"""
r = requests.post('http://{}:{}/restart'.format(self.device_ip, self.DEVICE_PORT))
logger.info('Response: {}'.format(r.text))
return
# Call debug server
while not self.terminate:
try:
time.sleep(30)
client_get()
time.sleep(300)
client_post()
except:
logger.exception('Exception on client thread.')
# stop signal received
logger.info("EXITING CLIENT THREAD")
Loop utama mengelola thread dan memulai ulang aplikasi ketika mereka keluar.
contoh Paket/123456789012-DEBUG_SERVER-1.0/Application.py — Loop utama
def main():
panorama = panoramasdk.node()
while True:
try:
# Instantiate application
logger.info('INITIALIZING APPLICATION')
app = Application(panorama)
# Create threads for stream processing, debugger, and client
app.run_thread = threading.Thread(target=app.run_cv)
app.server_thread = threading.Thread(target=app.run_debugger)
app.client_thread = threading.Thread(target=app.run_client)
# Start threads
logger.info('RUNNING APPLICATION')
app.run_thread.start()
logger.info('RUNNING SERVER')
app.server_thread.start()
logger.info('RUNNING CLIENT')
app.client_thread.start()
# Wait for threads to exit
app.run_thread.join()
app.server_thread.join()
app.client_thread.join()
logger.info('RESTARTING APPLICATION')
except:
logger.exception('Exception during processing loop.')
Untuk menyebarkan aplikasi sampel, lihat instruksi di GitHub repositori panduan ini