Saya memiliki lambda yang ditulis dalam Go yang berkomunikasi dengan aplikasi http ringan di belakang penyeimbang beban aplikasi di AWS:

package main

import (
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "time"
)

func main() {

    for {
        req, err := http.NewRequest("GET", "http://my-app-12345.us-east-1.elb.amazonaws.com:8080", nil)
        if err != nil {
            log.Fatal("Error reading request. ", err)
        }

        req.Header.Set("Load-Rate", os.Getenv("LOAD"))

        client := &http.Client{Timeout: time.Second * 10}

        resp, err := client.Do(req)
        if err != nil {
            log.Fatal("Error reading response. ", err)
        }
        if resp.StatusCode == http.StatusOK {
            bodyBytes, err := ioutil.ReadAll(resp.Body)
            if err != nil {
                log.Fatal(err)
            }
            bodyString := string(bodyBytes)
            log.Println(bodyString)
        }

        time.Sleep(time.Duration(10) * time.Millisecond)
    }
}

Saya telah membuka akses di seluruh dunia pada semua port dalam grup keamanan yang digunakan oleh lambda dan ALB dan saya dapat menggulung titik akhir dengan baik dari mesin rumah saya. Namun, ketika saya mencoba menjalankan ini di Lambda, saya mendapatkan yang berikut di log CloudWatch saya:

2020-06-04T07:06:31.028-05:00 Proses ditutup sebelum selesai permintaan
04-06-2020T07:06:41.100-05:00 2020/06/04 12:06:41 Kesalahan respon membaca. Dapatkan http://my-app-12345.us-east- 1.elb.amazonaws.com:8080: net/http: permintaan dibatalkan sambil menunggu koneksi (Client.Timeout terlampaui saat menunggu header)
06-04T07:06:41.101-05:00 2020/06/04 12:06:41 status keluar 1

Saya mengalami kesulitan mencari tahu apakah ini masalah Go atau beberapa konfigurasi yang saya salah di AWS. Saya tidak terlalu paham sama sekali dengan kesalahan yang dilontarkan Go di sini.

0
MrDuk 4 Juni 2020, 15:21

1 menjawab

Jawaban Terbaik

Lambda Anda tampaknya berada di VPC sejak Anda menulis tentang grup keamanannya. Jika ini masalahnya, kemungkinan besar alasan untuk batas waktu adalah lambda di VPC tidak memiliki akses internet atau IP publik, meskipun berada di subnet publik.

Dari dokumen:

Menghubungkan suatu fungsi ke subnet publik tidak memberikannya akses internet atau alamat IP publik.

Karena ALB Anda bersifat publik (Anda menggulungnya dari rumah), lambda Anda tidak dapat mengaksesnya, meskipun keduanya berada di subnet yang sama.

Untuk memperbaikinya, Anda harus menyiapkan Gerbang atau instance NAT dengan rute yang benar agar dapat berkomunikasi dari lambda di VPC ke ALB publik Anda, dan menempatkan lambda Anda di subnet pribadi.

1
Marcin 4 Juni 2020, 12:30