


Melaksanakan Lambda dengan GitLab CI/CD dan Terraform untuk Integrasi SFTP, S Databricks in Go
Mengurangkan Kos dengan Automasi Proses dalam Databricks
Saya memerlukan pelanggan untuk mengurangkan kos proses yang dijalankan pada Databricks. Salah satu ciri yang ditanggung oleh Databricks ialah mengumpul fail daripada pelbagai SFTP, menyahmampatnya dan meletakkannya di Tasik Data.
Mengautomasikan aliran kerja data ialah komponen penting dalam kejuruteraan data moden. Dalam artikel ini, kami akan meneroka cara mencipta fungsi AWS Lambda menggunakan GitLab CI/CD dan Terraform yang membenarkan aplikasi Go menyambung ke pelayan SFTP, mengumpul fail, menyimpannya dalam Amazon S3 dan akhirnya mencetuskan kerja pada Databricks. Proses hujung ke hujung ini penting untuk sistem yang bergantung pada penyepaduan dan automasi data yang cekap.
Perkara yang Anda Perlukan untuk Artikel Ini
- Akaun GitLab dengan repositori untuk projek.
- Akaun AWS dengan kebenaran untuk mencipta sumber Lambda, S3 dan IAM.
- Akaun Databricks dengan kebenaran untuk mencipta dan menjalankan pekerjaan.
- Pengetahuan asas Go, Terraform dan GitLab CI/CD.
Langkah 1: Menyediakan Aplikasi Go
Mulakan dengan mencipta aplikasi Go yang akan menyambung ke pelayan SFTP untuk mengumpul fail. Gunakan pakej seperti github.com/pkg/sftp untuk mewujudkan sambungan SFTP dan github.com/aws/aws-sdk-go untuk berinteraksi dengan perkhidmatan AWS S3.
package main import ( "fmt" "log" "os" "path/filepath" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3/s3manager" ) func main() { // Configuração do cliente SFTP user := "seu_usuario_sftp" pass := "sua_senha_sftp" host := "endereco_sftp:22" config := &ssh.ClientConfig{ User: user, Auth: []ssh.AuthMethod{ ssh.Password(pass), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), } // Conectar ao servidor SFTP conn, err := ssh.Dial("tcp", host, config) if err != nil { log.Fatal(err) } client, err := sftp.NewClient(conn) if err != nil { log.Fatal(err) } defer client.Close() // Baixar arquivos do SFTP remoteFilePath := "/path/to/remote/file" localDir := "/path/to/local/dir" localFilePath := filepath.Join(localDir, filepath.Base(remoteFilePath)) dstFile, err := os.Create(localFilePath) if err != nil { log.Fatal(err) } defer dstFile.Close() srcFile, err := client.Open(remoteFilePath) if err != nil { log.Fatal(err) } defer srcFile.Close() if _, err := srcFile.WriteTo(dstFile); err != nil { log.Fatal(err) } fmt.Println("Arquivo baixado com sucesso:", localFilePath) // Configuração do cliente S3 sess := session.Must(session.NewSession(&aws.Config{ Region: aws.String("us-west-2"), })) uploader := s3manager.NewUploader(sess) // Carregar arquivo para o S3 file, err := os.Open(localFilePath) if err != nil { log.Fatal(err) } defer file.Close() _, err = uploader.Upload(&s3manager.UploadInput{ Bucket: aws.String("seu-bucket-s3"), Key: aws.String(filepath.Base(localFilePath)), Body: file, }) if err != nil { log.Fatal("Falha ao carregar arquivo para o S3:", err) } fmt.Println("Arquivo carregado com sucesso no S3") }
Langkah 2: Mengkonfigurasi Terraform
Terraform akan digunakan untuk menyediakan fungsi Lambda dan sumber yang diperlukan pada AWS. Cipta fail main.tf dengan konfigurasi yang diperlukan untuk mencipta fungsi Lambda, dasar IAM dan baldi S3.
provider "aws" { region = "us-east-1" } resource "aws_iam_role" "lambda_execution_role" { name = "lambda_execution_role" assume_role_policy = jsonencode({ Version = "2012-10-17", Statement = [ { Action = "sts:AssumeRole", Effect = "Allow", Principal = { Service = "lambda.amazonaws.com" }, }, ] }) } resource "aws_iam_policy" "lambda_policy" { name = "lambda_policy" description = "A policy that allows a lambda function to access S3 and SFTP resources" policy = jsonencode({ Version = "2012-10-17", Statement = [ { Action = [ "s3:ListBucket", "s3:GetObject", "s3:PutObject", ], Effect = "Allow", Resource = [ "arn:aws:s3:::seu-bucket-s3", "arn:aws:s3:::seu-bucket-s3/*", ], }, ] }) } resource "aws_iam_role_policy_attachment" "lambda_policy_attachment" { role = aws_iam_role.lambda_execution_role.name policy_arn = aws_iam_policy.lambda_policy.arn } resource "aws_lambda_function" "sftp_lambda" { function_name = "sftp_lambda_function" s3_bucket = "seu-bucket-s3-com-codigo-lambda" s3_key = "sftp-lambda.zip" handler = "main" runtime = "go1.x" role = aws_iam_role.lambda_execution_role.arn environment { variables = { SFTP_HOST = "endereco_sftp", SFTP_USER = "seu_usuario_sftp", SFTP_PASSWORD = "sua_senha_sftp", S3_BUCKET = "seu-bucket-s3", } } } resource "aws_s3_bucket" "s3_bucket" { bucket = "seu-bucket-s3" acl = "private" }
Langkah 3: Mengkonfigurasi GitLab CI/CD
Dalam GitLab, tentukan saluran paip CI/CD dalam fail .gitlab-ci.yml. Saluran paip ini harus merangkumi langkah untuk menguji aplikasi Go, menjalankan Terraform untuk menyediakan infrastruktur dan langkah untuk pembersihan jika perlu.
stages: - test - build - deploy variables: S3_BUCKET: "seu-bucket-s3" AWS_DEFAULT_REGION: "us-east-1" TF_VERSION: "1.0.0" before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan -H 'endereco_sftp' >> ~/.ssh/known_hosts test: stage: test image: golang:1.18 script: - go test -v ./... build: stage: build image: golang:1.18 script: - go build -o myapp - zip -r sftp-lambda.zip myapp artifacts: paths: - sftp-lambda.zip only: - master deploy: stage: deploy image: hashicorp/terraform:$TF_VERSION script: - terraform init - terraform apply -auto-approve only: - master environment: name: production
Langkah 4: Mengintegrasikan dengan Databricks
Selepas memuat naik fail ke S3, fungsi Lambda mesti mencetuskan kerja dalam Databricks. Ini boleh dilakukan menggunakan API Databricks untuk melancarkan kerja sedia ada.
package main import ( "bytes" "encoding/json" "fmt" "net/http" ) // Estrutura para a requisição de iniciar um job no Databricks type DatabricksJobRequest struct { JobID int `json:"job_id"` } // Função para acionar um job no Databricks func triggerDatabricksJob(databricksInstance string, token string, jobID int) error { url := fmt.Sprintf("https://%s/api/2.0/jobs/run-now", databricksInstance) requestBody, _ := json.Marshal(DatabricksJobRequest{JobID: jobID}) req, err := http.NewRequest("POST", url, bytes.NewBuffer(requestBody)) if err != nil { return err } req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) client := &http.Client{} resp, err := client.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("Failed to trigger Databricks job, status code: %d", resp.StatusCode) } return nil } func main() { // ... (código existente para conectar ao SFTP e carregar no S3) // Substitua pelos seus valores reais databricksInstance := "your-databricks-instance" databricksToken := "your-databricks-token" databricksJobID := 123 // ID do job que você deseja acionar // Acionar o job no Databricks após o upload para o S3 err := triggerDatabricksJob(databricksInstance, databricksToken, databricksJobID) if err != nil { log.Fatal("Erro ao acionar o job do Databricks:", err) } fmt.Println("Job do Databricks acionado com sucesso") }
Langkah 5: Menjalankan Talian Paip
Tolak kod ke repositori GitLab untuk saluran paip berjalan. Semak sama ada semua langkah berjaya diselesaikan dan fungsi Lambda beroperasi dan berinteraksi dengan betul dengan S3 dan Databricks.
Setelah anda mempunyai kod lengkap dan fail .gitlab-ci.yml dikonfigurasikan, anda boleh menjalankan saluran paip dengan mengikuti langkah berikut:
- Tolak kod anda ke repositori GitLab:
package main import ( "fmt" "log" "os" "path/filepath" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3/s3manager" ) func main() { // Configuração do cliente SFTP user := "seu_usuario_sftp" pass := "sua_senha_sftp" host := "endereco_sftp:22" config := &ssh.ClientConfig{ User: user, Auth: []ssh.AuthMethod{ ssh.Password(pass), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), } // Conectar ao servidor SFTP conn, err := ssh.Dial("tcp", host, config) if err != nil { log.Fatal(err) } client, err := sftp.NewClient(conn) if err != nil { log.Fatal(err) } defer client.Close() // Baixar arquivos do SFTP remoteFilePath := "/path/to/remote/file" localDir := "/path/to/local/dir" localFilePath := filepath.Join(localDir, filepath.Base(remoteFilePath)) dstFile, err := os.Create(localFilePath) if err != nil { log.Fatal(err) } defer dstFile.Close() srcFile, err := client.Open(remoteFilePath) if err != nil { log.Fatal(err) } defer srcFile.Close() if _, err := srcFile.WriteTo(dstFile); err != nil { log.Fatal(err) } fmt.Println("Arquivo baixado com sucesso:", localFilePath) // Configuração do cliente S3 sess := session.Must(session.NewSession(&aws.Config{ Region: aws.String("us-west-2"), })) uploader := s3manager.NewUploader(sess) // Carregar arquivo para o S3 file, err := os.Open(localFilePath) if err != nil { log.Fatal(err) } defer file.Close() _, err = uploader.Upload(&s3manager.UploadInput{ Bucket: aws.String("seu-bucket-s3"), Key: aws.String(filepath.Base(localFilePath)), Body: file, }) if err != nil { log.Fatal("Falha ao carregar arquivo para o S3:", err) } fmt.Println("Arquivo carregado com sucesso no S3") }
provider "aws" { region = "us-east-1" } resource "aws_iam_role" "lambda_execution_role" { name = "lambda_execution_role" assume_role_policy = jsonencode({ Version = "2012-10-17", Statement = [ { Action = "sts:AssumeRole", Effect = "Allow", Principal = { Service = "lambda.amazonaws.com" }, }, ] }) } resource "aws_iam_policy" "lambda_policy" { name = "lambda_policy" description = "A policy that allows a lambda function to access S3 and SFTP resources" policy = jsonencode({ Version = "2012-10-17", Statement = [ { Action = [ "s3:ListBucket", "s3:GetObject", "s3:PutObject", ], Effect = "Allow", Resource = [ "arn:aws:s3:::seu-bucket-s3", "arn:aws:s3:::seu-bucket-s3/*", ], }, ] }) } resource "aws_iam_role_policy_attachment" "lambda_policy_attachment" { role = aws_iam_role.lambda_execution_role.name policy_arn = aws_iam_policy.lambda_policy.arn } resource "aws_lambda_function" "sftp_lambda" { function_name = "sftp_lambda_function" s3_bucket = "seu-bucket-s3-com-codigo-lambda" s3_key = "sftp-lambda.zip" handler = "main" runtime = "go1.x" role = aws_iam_role.lambda_execution_role.arn environment { variables = { SFTP_HOST = "endereco_sftp", SFTP_USER = "seu_usuario_sftp", SFTP_PASSWORD = "sua_senha_sftp", S3_BUCKET = "seu-bucket-s3", } } } resource "aws_s3_bucket" "s3_bucket" { bucket = "seu-bucket-s3" acl = "private" }
- GitLab CI/CD akan mengesan komit baharu dan memulakan saluran paip secara automatik.
- Ikuti perlaksanaan saluran paip dalam GitLab dengan mengakses bahagian CI/CD repositori anda.
- Jika semua peringkat berjaya, fungsi Lambda anda akan digunakan dan sedia untuk digunakan.
Ingat bahawa anda perlu mengkonfigurasi pembolehubah persekitaran dalam GitLab CI/CD untuk menyimpan maklumat sensitif seperti token akses dan kunci peribadi. Ini boleh dilakukan dalam 'Tetapan' > 'CI/CD' > ‘Pembolehubah’ daripada projek GitLab anda.
Selain itu, pastikan token Databricks mempunyai kebenaran yang diperlukan untuk mencetuskan kerja dan kerja itu wujud dengan ID yang diberikan.
Kesimpulan
Mengautomasikan tugas kejuruteraan data boleh dipermudahkan dengan ketara menggunakan alatan seperti GitLab CI/CD, Terraform dan AWS Lambda. Dengan mengikuti langkah-langkah yang digariskan dalam artikel ini, anda boleh mencipta sistem teguh yang mengautomasikan pengumpulan dan penyepaduan data antara SFTP, S3 dan Databricks, semuanya dengan kecekapan dan kesederhanaan Go Dengan pendekatan ini, anda akan dilengkapi dengan baik untuk menangani masalah tersebut cabaran penyepaduan data pada skala.
Kenalan saya:
LinkedIn - Airton Lira Junior
iMasters - Airton Lira Junior
aws #lambda #terraform #gitlab #ci_cd #go #databricks #dataengineering #automation
stages: - test - build - deploy variables: S3_BUCKET: "seu-bucket-s3" AWS_DEFAULT_REGION: "us-east-1" TF_VERSION: "1.0.0" before_script: - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan -H 'endereco_sftp' >> ~/.ssh/known_hosts test: stage: test image: golang:1.18 script: - go test -v ./... build: stage: build image: golang:1.18 script: - go build -o myapp - zip -r sftp-lambda.zip myapp artifacts: paths: - sftp-lambda.zip only: - master deploy: stage: deploy image: hashicorp/terraform:$TF_VERSION script: - terraform init - terraform apply -auto-approve only: - master environment: name: production
Atas ialah kandungan terperinci Melaksanakan Lambda dengan GitLab CI/CD dan Terraform untuk Integrasi SFTP, S Databricks in Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Interfacesandpolymorphismingoenhancecodereusabilityandmaintainability.1) DefineInterfacesatTheRightAbstractionLevel.2) UseInterfacesforddendencyInjection.3) ProfileCodeTanageperperformanceImpacts.

TheinitfunctioningorunsautomaticallybeforethemainfunctiontoinitialializePackagesandsetuptheenvironment.it'susforforsettingupglobalvariables, sumber, danperformingone-timesetuptasksacrossanypackage

Kombinasi antara muka membina abstraksi kompleks dalam pengaturcaraan GO dengan memecahkan fungsi ke dalam antara muka kecil yang terfokus. 1) Tentukan pembaca, penulis dan antara muka yang lebih dekat. 2) Buat jenis kompleks seperti fail dan rangkaian dengan menggabungkan antara muka ini. 3) Gunakan fungsi ProcessData untuk menunjukkan cara mengendalikan antara muka gabungan ini. Pendekatan ini meningkatkan fleksibiliti kod, kesesuaian, dan kebolehgunaan semula, tetapi penjagaan harus diambil untuk mengelakkan pemecahan yang berlebihan dan kerumitan gabungan.

InitfunctionsingoareautomaticallycalledbeforethemainfunctionAntareusforsetupbutcomewithchallenges.1) ExecutionOrder: MultipleInitFunctionsRunindefinitionorder, whycancauseSifeDeydependoneachother.2)

Artikel membincangkan melewati peta di GO, memberi tumpuan kepada amalan selamat, memodifikasi penyertaan, dan pertimbangan prestasi untuk peta besar. Masalah: Memastikan lelaran peta yang selamat dan cekap di GO, terutamanya dalam persekitaran serentak dan dengan L

Artikel ini membincangkan membuat dan memanipulasi peta di GO, termasuk kaedah permulaan dan menambah/mengemas kini elemen.

Artikel ini membincangkan perbezaan antara tatasusunan dan kepingan dalam GO, memberi tumpuan kepada saiz, peruntukan memori, lulus fungsi, dan senario penggunaan. Array adalah saiz tetap, diperuntukkan stack, manakala kepingan adalah dinamik, sering ditumpukan, dan lebih fleksibel.

Artikel ini membincangkan membuat dan memulakan irisan di GO, termasuk menggunakan literals, fungsi membuat, dan mengiris tatasusunan atau kepingan yang ada. Ia juga meliputi sintaks kepingan dan menentukan panjang dan kapasiti kepingan.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penyesuai Pelayan SAP NetWeaver untuk Eclipse
Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini
