Bagaimana untuk membina aplikasi Golang pluggable dan manfaat daripada Laps AWS Lambda.

Golang - mengapa patut perhatian anda?

Golang adalah bahasa pengaturcaraan sumber terbuka yang direka dan dilaksanakan oleh Google. Ia digunakan secara meluas dalam aplikasi moden terutamanya di awan. Ciri-ciri yang paling khas ialah:

  • Golang diketik secara statik - ia memberikan kelenturan yang kurang, tetapi melindungi anda daripada membuat kesilapan,
  • Ia bukan berorientasikan objek. Walau bagaimanapun, anda boleh membuat struktur dan antara muka dan memberikan anda 3 daripada 4 prinsip OOP: abstraksi data, pengkapsulan, dan polimorfisme. Warisan adalah satu-satunya yang hilang,
  • Goroutines! - pelaksanaan terbesar benang cahaya yang pernah saya gunakan. Ia membolehkan anda membuat thread baru dengan cara yang mudah dengan menggunakan pengendali pergi dan berkomunikasi antara goroutines yang berbeza menggunakan saluran,
  • Ia dikompil ke binari tunggal dengan semua kebergantungan - tidak ada lagi konflik pakej!

Secara peribadi, saya menganggap Golang sebagai bahasa yang paling hebat yang saya gunakan setiap hari. Walau bagaimanapun, artikel ini tidak akan mencipta fungsi pertama atau mencetak "Hello World". Saya akan menunjukkan kepada anda sedikit perkara yang lebih maju. Sekiranya anda seorang pemula dan ingin mengetahui lebih lanjut mengenai Golang, sila lawati halaman utamanya.

AWS Lambda & Golang

AWS Lambda adalah salah satu perkhidmatan perhitungan tanpa servis yang paling popular di awan awam, dikeluarkan pada bulan November 2014 oleh Amazon Web Services. Ia membolehkan anda menjalankan kod anda sebagai tindak balas kepada peristiwa-peristiwa seperti pencetus DynamoDB, SNS atau HTTP tanpa menyediakan atau mengurus pelayan! Adakah anda tahu apa yang benar-benar hebat? Sejak Januari 2018 ia menyokong runtime Golang. Bekerja dengan AWS Lambda sangat mudah - hanya muat naik pakej zip dengan kod anda dan semua dependencies (binari tunggal apabila menggunakan Golang).

Maju ke hadapan, 4 tahun kemudian pada 2018 semula: Mencipta AWS melepaskan Lambda Layers yang membolehkan anda menyimpan dan menguruskan data yang dikongsi di seluruh fungsi yang berbeza dalam akaun AWS berganda atau ganda! Sebagai contoh, Semasa menggunakan Python anda boleh meletakkan semua ketergantungan dalam lapisan tambahan yang kemudiannya boleh digunakan oleh Lambdas yang lain. Tidak perlu meletakkan kebergantungan yang berbeza dalam setiap pakej zip lagi! Dalam situasi dunia Golang adalah berbeza kerana AWS Lambda mengharuskan anda untuk meng-upload binary yang disusun. Bagaimanakah kita boleh mendapat manfaat daripada Laps AWS Lambda? Jawapannya mudah - membina aplikasi modular menggunakan Golang Plugins!

Golang Plugins - cara untuk membina aplikasi modular

Golang Plugins adalah ciri yang dikeluarkan dalam Go1.8 yang membolehkan anda memuatkan perpustakaan bersama (.so fail) secara dinamik. Ia memberi anda peluang untuk mengeksport beberapa kod anda ke perpustakaan berasingan atau menggunakan plugin yang disediakan dan disusun oleh orang lain. Akan tetapi, menjanjikan, ada beberapa batasan:

  • Plugin anda perlu menjadi modul utama tunggal,
  • Anda hanya boleh memuatkan fungsi dan pembolehubah yang dieksport sebagai simbol ELF,
  • Oleh sebab menaip statik, anda perlu menghantar setiap simbol yang dimuatkan ke jenis yang betul. Dalam senario yang paling teruk, anda perlu menentukan antara muka yang betul dalam kod anda,
  • Ia berfungsi hanya untuk Linux dan MacOS. Secara peribadi, saya tidak menganggap ini sebagai kelemahan :)

Membina dan menguji plugin pertama anda

Sekarang mari buat plugin pertama kami. Sebagai contoh, kami akan membuat modul mudah untuk penyulitan rentetan. Mari kembali kepada asas dan melaksanakan 2 algoritma penyulitan mudah - Ceasar dan Verman.

  • Caesar cipher adalah algoritma yang pertama digunakan oleh Julius Siaran. Ia mengalihkan setiap huruf dalam teks dengan bilangan jawatan tetap. Sebagai contoh, jika anda ingin menyulitkan kata kunci dengan kunci 4, anda akan mendapat ktpek. Penyahkulasian berfungsi dengan cara yang sama. Anda hanya perlu menukar huruf ke arah yang bertentangan.
  • Verman cipher adalah serupa dengan Ceaser, berdasarkan idea peralihan yang sama, perbezaannya ialah anda mengalihkan setiap huruf dengan bilangan jawatan yang berlainan. Untuk menyahsulit teks yang anda perlukan untuk mempunyai kunci yang mengandungi kedudukan yang digunakan untuk menyulitkan teks. Sebagai contoh, jika anda mahu menyulitkan perkataan golang dengan kunci [-1, 4, 7, 20, 4, -2], anda akan mendapat masa depan.

Pelaksanaan penuh contoh ini tersedia di sini.

Pelaksanaan Plugin

Coretan berikut mengandungi pelaksanaan dua algoritma yang disebutkan di atas. Untuk setiap satu, kami melaksanakan 2 kaedah penyulitan dan penyahkodan teks kami:

Seperti yang anda lihat, kami mengeksport di sini 3 simbol yang berlainan (Golang eksport hanya pengenal ini yang bermula dengan huruf atas):

  • EncryptCeasar - func (int, string) rentetan yang menyulitkan teks menggunakan algoritma Ceasar,
  • DecryptCeaser - func (int, string) rentetan yang menyahsulit teks menggunakan algoritma Caeser,
  • VermanCipher - pemboleh ubah jenis vermanCipher melaksanakan 2 kaedah: Encrypt: func (string) string dan Decrypt: func () (* string, error)

Untuk menyusun plugin ini, anda perlu menjalankan arahan berikut:

buka build -buildmode = plugin -o plugin / cipher.so plugin / cipher.go

Buat masa ini, tiada apa yang istimewa - beberapa fungsi mudah dicipta dan modul disusun sebagai plugin dengan menambah hujah -buildmode = plugin.

Muatkan dan tempuh plugin

Keseronokan bermula apabila kami mahu menggunakan plugin yang disusun dalam aplikasi kami. Mari buat contoh mudah:

Pertama, anda perlu mengimport pakej plugin pegun. Ia mengandungi hanya dua fungsi - yang pertama adalah untuk memuatkan perpustakaan yang dikongsi dan yang kedua adalah untuk mencari simbol yang dieksport. Untuk memuatkan pustaka anda, anda perlu menggunakan fungsi Terbuka yang memerlukan menyediakan laluan kepada plugin anda yang dikongsi dan mengembalikan pembolehubah jenis pembolehubah. Jika memuatkan perpustakaan tidak mungkin (contohnya jalan yang salah atau fail yang rosak) fungsi ini mengembalikan ralat yang perlu dikendalikan.

Langkah seterusnya adalah untuk memuatkan setiap simbol yang dieksport menggunakan kaedah Lookup. Kesulitan yang sedikit adalah bahawa anda perlu memuatkan setiap fungsi yang dieksport secara berasingan. Walau bagaimanapun, anda boleh menggabungkan pelbagai fungsi bersama-sama dengan cara yang sama seperti yang telah dilakukan untuk simbol VermanCipher. Sebaik sahaja anda telah memuatkan semua simbol yang anda mahu gunakan, anda perlu membuangnya ke jenis yang betul. Golang adalah bahasa yang diketik secara statik supaya tidak ada cara lain untuk menggunakan simbol ini tanpa pemutus. Ingat, apabila anda mengeksport pemboleh ubah yang melaksanakan beberapa kaedah, anda perlu membuangnya ke jenis antara muka yang betul (saya harus menentukan antara muka enjin enkripsi untuk mengendalikannya). \ Newline \ newline

Untuk menyusun dan menjalankan aplikasi menggunakan arahan berikut:

pergi buat app.go
./aplikasi

Dalam keluaran, anda harus melihat teks yang disulitkan dan disahsulit sebagai bukti bahawa algoritma berfungsi dengan betul.

Gunakan plugin dalam AWS lambda

Untuk menggunakan plugin kami di AWS Lambda kami perlu membuat beberapa pengubahsuaian dalam permohonan kami:

  • AWS Lambda memasang lapisan ke direktori / opt dalam lambda container, jadi kita perlu memuatkan plugin kami dari direktori ini.
  • Kita perlu membuat fungsi pengendali yang akan digunakan oleh enjin Lambda untuk mengendalikan peristiwa ujian kami.

Coretan berikut mengandungi aplikasi kami yang disesuaikan untuk digunakan oleh Lambda:

Seperti yang anda dapat lihat pelaksanaannya sangat serupa dengan yang sebelumnya. Kami hanya menukar direktori yang kami memuatkan plugin kami dan menambahkan respons fungsi dan bukannya mencetak nilai. Jika anda ingin mengetahui lebih lanjut tentang menulis Lambdas dalam golang sila periksa dokumentasi AWS.

Penyebaran AWS Lambda

Terdapat dua cara untuk menggerakkan fungsi dan lapisan AWS Lambda. Anda boleh membuat dan memuat naik pakej zip secara manual atau menggunakan rangka kerja yang lebih maju, yang menjadikannya lebih mudah dan lebih cepat. Untuk sebahagian besar projek saya, saya menggunakan rangka kerja tanpa pelayan, jadi saya telah menyediakan fail konfigurasi serverless.yml yang mudah menggunakan alat ini:

perkhidmatan: cipherService
frameworkVersion: "> = 1.28.0 <2.0.0"
pembekal:
  nama: aws
  runtime: go1.x
lapisan:
  cipherLayer:
    jalan: bin / plugin
    serasiRuntimes:
      - go1.x
fungsi:
  enjin:
    pengendali: bin / cipherEngine
    pakej:
      tidak termasuk:
        - ./**
      termasuk:
        - ./bin/cipherEngine
    lapisan:
      - {Ref: CipherLayerLambdaLayer}

Dalam lapisan lapisan kami menetapkan lapisan tunggal dengan laluan ke plugin yang sudah dibuat - ia akan digunakan bersama dengan fungsi lambda. Anda boleh menentukan sehingga 5 lapisan berbeza yang memerintahkan adalah sangat penting. Mereka dipasang ke direktori yang sama / pilih, jadi lapisan dengan bilangan yang lebih tinggi dapat menimpa fail dari lapisan yang dipasang sebelumnya. Untuk setiap lapisan, anda perlu menyediakan sekurang-kurangnya 2 parameter: jalan ke direktori yang mengandungi sumber lapisan (laluan ke peralihan binari dalam kes anda) dan senarai runtime yang serasi.

Bahagian fungsi seterusnya adalah tempat di mana anda menentukan senarai fungsi yang akan digunakan. Untuk setiap fungsi, anda perlu menyediakan sekurang-kurangnya laluan ke aplikasi yang disusun. Di samping itu, kami perlu menentukan parameter lapisan dengan merujuk kepada lapisan yang ditakrifkan di atas. Ini secara automatik akan melampirkan lapisan ke fungsi Lambda kami semasa penggunaannya. Perkara yang lucu adalah bahawa anda perlu menukar nama lapisan lambda anda menjadi TitleCased dan tambahkan akhiran LambdaLayer jika anda mahu merujuk kepada sumber itu. Nampaknya pasukan tanpa pelayan melaksanakannya dengan cara ini untuk menyelesaikan konflik dengan merujuk kepada jenis sumber yang berlainan.

Setelah fail konfigurasi serverless.yml kami siap, perkara terakhir yang perlu dilakukan ialah menyusun aplikasi kami, plugin dan menggunakannya. Kita boleh menggunakan Makefile mudah untuk itu:

.PHONY: bina membinaPlugin bersihkan
membina:
 dep memastikan -v
 env GOOS = linux go build -ldflags = "- s -w" -o bin / cipherEngine cipherEngine / main.go
buildPlugin:
 env GOOS = linux go build -ldflags = "- s -w" -buildmode = plugin -o bin / plugin / cipher.so ../plugin/cipher.go
bersih:
 rm -rf ./bin ./vendor Gopkg.lock
menggunakan: membina bersihPlugin membina
 sls menggunakan --verbose

Anda boleh membina dan menggunakan fungsi anda dengan menjalankan arahan berikut:

membuat penyebaran

Uji AWS Lambda

Seperti yang telah saya nyatakan sebelumnya, AWS Lambda melaksanakan kod dalam respon terhadap kejadian tersebut. Walau bagaimanapun kami tidak mengkonfigurasi mana-mana pemicu peristiwa, jadi ia tidak akan dipanggil tanpa bantuan kami. Kita perlu melakukannya secara manual menggunakan rangka kerja tanpa pelayan atau alat awscli:

sls invoke -f function_name
aws lambda invoke - function-name function_name output_file

Dalam tindak balas, anda harus melihat output yang sama seperti sebelumnya, yang membuktikan bahawa fungsi lambda kami berfungsi dengan betul dan memuatkan plugin dari lapisan tambahan. Sekarang anda boleh membuat fungsi lain yang akan menggunakan lapisan yang sama atau berkongsi dengan akaun AWS yang lain.

Ringkasan

Ia amat menyeronokkan untuk menggunakan modul Golang dan menguji bagaimana menggabungkan mereka dengan AWS Lambda Layers yang baru dilepaskan. Perpustakaan Plugin sangat hebat, namun kerana batasan dan spesifikasi Golang ia boleh digunakan hanya dalam beberapa senario khas. Saya fikir bahawa bagi sebahagian besar pemaju yang mengerjakan projek standard itu tidak diperlukan atau mungkin menggunakan plugin. Hanya dua sebab yang datang ke fikiran saya:

  • Melaksanakan algoritma rumit yang boleh digunakan oleh aplikasi lain ex. pengekodan video atau algoritma penyulitan.
  • Berkongsi algoritma anda dengan orang lain tanpa menerbitkan kodanya.