Giới hạn lambda python

Bài đăng này hiện đã lỗi thời vì AWS Lambda cho phép người dùng tạo và phân phối các lớp với tất cả các loại plugin và gói, bao gồm cả Selenium và chromedriver. Điều này đơn giản hóa rất nhiều quá trình. Đây là một bài viết về cách tạo một lớp như vậy. Và đây là danh sách các lớp được đóng gói sẵn hữu ích

Bài đăng này chỉ nên được sử dụng như một tài liệu tham khảo lịch sử

TL; DR. Bài đăng này trình bày chi tiết cách chạy trình quét web trên AWS Lambda bằng Selenium và trình duyệt Chrome headless, đồng thời sử dụng Docker để kiểm tra cục bộ. Nó dựa trên hướng dẫn này, nhưng nó không hiệu quả với tôi vì các phiên bản của Selenium, headless Chrome và chromedriver không tương thích. Những gì đã làm việc như sau

  • serverless-chrome v. 0. 0-37
  • chromedriver v. 2. 37
  • Selenium cho Python v. 2. 53. 6

CHỈNH SỬA. Các phiên bản trên không còn được hỗ trợ. Theo vấn đề GitHub này, các phiên bản này hoạt động tốt với nhau

  • chromedriver 2. 43
  • serverless-chrome 1. 0. 0-55
  • selen 3. 14

toàn bộ câu chuyện

Gần đây, tôi đã trải qua vài tuần bực bội khi cố gắng triển khai một công cụ quét web Selenium tự chạy hàng đêm và lưu kết quả vào cơ sở dữ liệu trên Amazon S3. Với bài đăng này, tôi hy vọng sẽ giúp bạn không muốn đập vỡ tất cả các máy tính bằng búa tạ

Đầu tiên, một số nền tảng

Tôi muốn quét một trang web của chính phủ được cập nhật thường xuyên hàng đêm, phát hiện các bổ sung mới, thông báo cho tôi qua email khi tìm thấy thứ gì đó và lưu kết quả. Tôi có thể đã chạy tập lệnh trên máy tính của mình bằng công việc định kỳ trên máy Mac hoặc tác vụ đã lên lịch trên Windows

Nhưng máy tính để bàn không đáng tin cậy. Chúng có thể vô tình bị rút phích cắm hoặc khởi động lại do cập nhật. Tôi muốn tập lệnh của mình được chạy từ một máy chủ không bao giờ tắt

Tại hội nghị NICAR 2018, tôi đã tìm hiểu về các ứng dụng serverless sử dụng AWS Lambda, vì vậy đây có vẻ là một giải pháp lý tưởng. Nhưng bản demo tôi đã xem và hầu hết tất cả các tài liệu và bài đăng trên blog về điều này đều sử dụng Node. js. Tôi muốn làm việc trên Python, Lambda cũng hỗ trợ

Xin chào không có máy chủ

Làm sao một thứ có thể không có máy chủ nếu nó chạy trên máy chủ Amazon? . Bạn không cần phải thiết lập phần mềm, bảo trì hoặc đảm bảo phần mềm vẫn đang chạy. Amazon làm tất cả cho bạn. Bạn chỉ cần tải lên tập lệnh của mình và cho nó biết phải làm gì. Và nó tốn một xu một tháng, ngay cả đối với những thứ vụn vặt hàng ngày

Xin chào PyChromless

Hướng dẫn này chủ yếu dựa trên repo này từ 21 Buttons, một mạng xã hội thời trang có trụ sở tại Barcelona. Họ đã thực hiện hầu hết các công việc nặng nhọc để có được trình quét Selenium bằng trình duyệt không đầu Chrome hoạt động ở Lambda bằng Python. Tôi chỉ đơn giản là sửa đổi nó một chút để làm việc cho tôi

Tải repo của họ xuống máy của bạn. Các tập tin quan trọng là những

  • Dockerfile
  • Makefile
  • soạn thảo docker. yml
  • yêu cầu. txt

Phần còn lại bạn có thể xóa

Xin chào Lambda

Lambda là nền tảng ứng dụng serverless của Amazon. Nó cho phép bạn viết hoặc tải lên một tập lệnh chạy theo các trình kích hoạt khác nhau mà bạn cung cấp cho nó. Ví dụ: nó có thể chạy vào một thời điểm nhất định hoặc khi một tệp được thêm hoặc thay đổi trong bộ chứa S3

Đây là thông tin thêm về nó

Đây là cách tôi thiết lập phiên bản Lambda của mình

1. Truy cập AWS Lambda, chọn khu vực ưa thích của bạn và tạo chức năng mới

2. Chọn “Tác giả từ đầu”. Đặt cho nó một tên hàm và chọn Python 3. 6 làm thời gian chạy. Trong “Vai trò”, chọn “Tạo vai trò mới từ mẫu”. Các vai trò xác định các quyền mà chức năng của bạn có để truy cập các dịch vụ AWS khác, chẳng hạn như S3. Bây giờ hãy đặt cho vai trò này một cái tên như "người cạo". Trong “Mẫu chính sách”, chọn “Quyền Lambda cơ bản”, cấp cho chức năng của bạn khả năng chạy và tạo nhật ký. Nhấn “Tạo chức năng”

3. Bây giờ bạn đang ở trong bảng điều khiển Lambda chính. Đây là nơi bạn thiết lập trình kích hoạt, biến môi trường và truy cập nhật ký. Vì chúng tôi muốn điều này chạy theo lịch trình, chúng tôi cần thiết lập trình kích hoạt. Trên menu “thêm trình kích hoạt” ở bên trái, hãy chọn Sự kiện CloudWatch

Nhấp vào “Yêu cầu cấu hình” để thiết lập thời gian tập lệnh sẽ chạy. Một biểu mẫu sẽ xuất hiện bên dưới nó

Trong “Quy tắc”, chọn “Tạo quy tắc mới”. Đặt cho nó một tên quy tắc. Nó có thể là bất cứ thứ gì, chẳng hạn như “dailyscrape”. Cung cấp cho nó một mô tả để bạn biết nó đang làm gì nếu bạn quên

Bây giờ bạn phải viết biểu thức cron kỳ lạ cho nó biết khi nào nên chạy. Tôi muốn cạp để chạy lúc 11 giờ tối EST mỗi đêm. Ở Lambda, bạn cần nhập thời gian theo GST, vậy là 3 giờ sáng. biểu hiện của tôi do đó cần phải được

cron[0 3 * * ? *]

Để biết thêm về cú pháp cron, hãy đọc phần này

Nhấp vào “Thêm” và thế là xong. Chức năng của bạn được đặt để chạy vào thời gian đã lên lịch

4. Bây giờ chúng ta cần thêm chức năng thực tế của mình. Nhưng trước tiên, hãy thiết lập một số biến môi trường

Phần “Mã chức năng” cho phép bạn viết mã trong trình soạn thảo văn bản nội tuyến, tải gói ZIP lên hoặc tải lên từ S3. Trình quét Selenium rất lớn vì bạn cần bao gồm một trình duyệt Chrome với nó. Vì vậy, hãy chọn “Tải tệp lên từ Amazon S3”. Chúng ta sẽ quay lại vấn đề này sau

5. Chúng ta cần thiết lập các biến môi trường của mình. Vì chúng tôi sẽ tải trình duyệt Chrome lên nên chúng tôi cần cho Lambda biết nơi tìm trình duyệt đó. Vì vậy, hãy bấm vào các khóa và giá trị này

PATH = /var/task/bin

PYTHONPATH = /var/task/src:/var/task/lib

6. Cuối cùng, cấu hình các tùy chọn cuối cùng. Trong “Vai trò thực thi”, hãy chọn vai trò bạn đã xác định ở bước đầu tiên. Chúng tôi sẽ cần định cấu hình điều này hơn nữa trong một bước trong tương lai

Trong “Cài đặt cơ bản”, hãy chọn dung lượng bộ nhớ sẽ được phân bổ cho trình quét của bạn. Trình cạp của tôi hiếm khi cần nhiều hơn 1000 MB, nhưng tôi cho nó nhiều hơn một chút để đảm bảo an toàn. Nếu bộ nhớ đã sử dụng vượt quá giới hạn này, Lambda sẽ chấm dứt chức năng

Tương tự với thời gian thực hiện. Lambda cho bạn tối đa năm phút để chạy một chức năng. Nếu cạp của bạn vượt quá mức đó, bạn sẽ cần phải suy nghĩ lại. Có thể chia nó thành hai chức năng Lambda

Và đó là tất cả cấu hình chúng tôi cần trong Lambda lúc này

Xin chao tôi la

Hãy nhớ rằng chúng tôi đã cấp cho chức năng này các quyền Lambda cơ bản nhất? . Đó là nơi vai trò của bạn đến. Và bạn cần định cấu hình vai trò của mình trong IAM, hệ thống Quản lý quyền truy cập và danh tính của Amazon

1. Chuyển đến IAM. Nhấp vào “Vai trò” trên menu bên trái. Bạn sẽ thấy vai trò bạn đã tạo trong phần trước. Nhấn vào nó. Bạn sẽ thấy rằng nó có một chính sách kèm theo. AWSLambdaEdgeExecutionRole, quyền Lambda cơ bản nhất

2. Nhấp vào “Đính kèm chính sách”. Tìm kiếm S3. Chọn AmazonS3FullAccess. Điều này sẽ cho phép chức năng đọc và ghi vào S3. Nhấp vào “Đính kèm chính sách”. Đó là nó. Khi bạn quay lại Lambda, bây giờ bạn sẽ thấy S3 là một tài nguyên

Xin chào Docker

Bây giờ, chúng tôi đã sẵn sàng tải trình quét lên Lambda

Nhưng chờ đã. Làm thế nào để bạn biết nó sẽ làm việc? . Đó là một môi trường máy tính khác. Bạn sẽ muốn thử nghiệm cục bộ trên máy của mình mô phỏng môi trường Lambda. Nếu không, thật khó để tiếp tục tải tệp lên Lambda với mỗi thay đổi bạn thực hiện

Đó là nơi Docker xuất hiện. Đó là một công cụ tạo các thùng chứa máy ảo mô phỏng các môi trường mà bạn sẽ triển khai tới. Và có một bộ chứa Lambda tiện dụng đã sẵn sàng để bạn sử dụng

Vì vậy, trước tiên, hãy cài đặt Docker

Sau đó mở docker-compose. tệp yml bạn đã tải xuống. Điều này chỉ định các biến môi trường mà bạn đã xác định trong Lambda trước đó

Bạn sẽ cần chỉnh sửa phần này nếu muốn đọc và ghi vào S3 trong khi thử nghiệm từ máy cục bộ của mình. Cụ thể, bạn cần thêm tên bộ chứa S3 và thông tin đăng nhập AWS

version: '3'

services:
  lambda:
    build: .
    environment:
      - PYTHONPATH=/var/task/src:/var/task/lib
      - PATH=/var/task/bin
      - AWS_BUCKET_NAME='YOUR-BUCKET-NAME'
      - AWS_ACCESS_KEY_ID='YOUR-AWS-KEY-ID'
      - AWS_SECRET_ACCESS_KEY='YOUR-AWS-ACCESS-KEY'
    volumes:
      - ./src/:/var/task/src/

Sau đó tiếp tục bên dưới

Xin chào Makefile

Các quý ông tại 21Buttons đã tạo một Makefile đáng yêu thực hiện công việc tự động tạo bộ chứa Docker, chạy trình quét trong môi trường Docker và đóng gói các tệp để tải lên Lambda

Makefile là gì? . Để sử dụng Makefiles, bạn sẽ cần cài đặt các công cụ dòng lệnh của Mac. Trên Windows, có thể chạy Makefiles bằng Powershell, nhưng tôi không có kinh nghiệm về điều này

Tôi sẽ không đi qua tất cả các mục trong Makefile, nhưng bạn có thể đọc về nó ở đây

Bạn sẽ cần thay đổi Makefile để tải xuống đúng phiên bản của headless-chrome và chromedriver. Như tôi đã nói trong phần giới thiệu, các phiên bản được sử dụng bởi 21Buttons không phù hợp với tôi

Đây là Makefile đã hoạt động

clean:
	rm -rf build build.zip
	rm -rf __pycache__

fetch-dependencies:
	mkdir -p bin/

	# Get chromedriver
	curl -SL //chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
	unzip chromedriver.zip -d bin/

	# Get Headless-chrome
	curl -SL //github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
	unzip headless-chromium.zip -d bin/

	# Clean
	rm headless-chromium.zip chromedriver.zip

docker-build:
	docker-compose build

docker-run:
	docker-compose run lambda src/lambda_function.lambda_handler

build-lambda-package: clean fetch-dependencies
	mkdir build
	cp -r src build/.
	cp -r bin build/.
	cp -r lib build/.
	pip install -r requirements.txt -t build/lib/.
	cd build; zip -9qr build.zip .
	cp build/build.zip .
	rm -rf build

xin chào yêu cầu. txt

Bạn cũng sẽ cần chỉnh sửa các yêu cầu. txt để tải xuống các thư viện Python hoạt động với trình duyệt và trình điều khiển Chrome

Đây là mức tối thiểu bạn cần để chạy Selenium với chromedriver và nếu bạn muốn đọc/ghi quyền truy cập vào S3. Đó là mục đích của thư viện boto3

boto3==1.6.18
botocore==1.9.18
selenium==2.53.6
chromedriver-installer==0.0.6

Xin chào con trăn

Bạn đã sẵn sàng sử dụng mã cạp của mình, nhưng bạn không thể chỉ tải nó lên. Bạn phải đặt nhiều tùy chọn cho trình điều khiển Chrome để nó hoạt động trên Lambda. Một lần nữa, 21Buttons đã làm việc chăm chỉ để tìm ra các tùy chọn phù hợp

Thông thường, khi bạn chạy trình quét Selenium trên máy của mình, nó chỉ cần khởi động như thế này là đủ

from selenium import webdriver

driver = webdriver.Chrome[]

Nhưng chúng tôi đang sử dụng trình duyệt Chrome không đầu. Đó là, một trình duyệt chạy không có giao diện người dùng. Vì vậy, bạn cần chỉ định điều này và một loạt những thứ khác

Đây là những gì bạn cần phải vượt qua. Lưu ý dòng rất quan trọng gần cuối cho Lambda biết nơi tìm tệp nhị phân Chrome không đầu. Nó sẽ được đóng gói trong một thư mục có tên bin

from selenium import webdriver
import os

chrome_options = webdriver.ChromeOptions[]
chrome_options.add_argument['--headless']
chrome_options.add_argument['--no-sandbox']
chrome_options.add_argument['--disable-gpu']
chrome_options.add_argument['--window-size=1280x1696']
chrome_options.add_argument['--user-data-dir=/tmp/user-data']
chrome_options.add_argument['--hide-scrollbars']
chrome_options.add_argument['--enable-logging']
chrome_options.add_argument['--log-level=0']
chrome_options.add_argument['--v=99']
chrome_options.add_argument['--single-process']
chrome_options.add_argument['--data-path=/tmp/data-path']
chrome_options.add_argument['--ignore-certificate-errors']
chrome_options.add_argument['--homedir=/tmp']
chrome_options.add_argument['--disk-cache-dir=/tmp/cache-dir']
chrome_options.add_argument['user-agent=Mozilla/5.0 [X11; Linux x86_64] AppleWebKit/537.36 [KHTML, like Gecko] Chrome/61.0.3163.100 Safari/537.36']
chrome_options.binary_location = os.getcwd[] + "/bin/headless-chromium"

driver = webdriver.Chrome[chrome_options=chrome_options]

Cuối cùng, bạn cần đặt tên cho tệp và chức năng của mình để Lambda biết cách chạy. Theo mặc định, Lambda sẽ tìm một tệp có tên lambda_function. py và chạy một hàm gọi là lambda_handler. Bạn có thể gọi nó là bất cứ thứ gì bạn muốn, chỉ cần đảm bảo rằng bạn thay đổi tên này trong bảng điều khiển Lambda [trong “Trình xử lý”] và trong Makefile của bạn, dưới lệnh “docker-run”

Vì vậy, nếu tệp của bạn có tên làcrime_scraper. py và chức năng chính của bạn được gọi là main[], bạn cần thay đổi các giá trị này thànhcrime_scraper. chính

Để tất cả chúng cùng nhau

Bây giờ, bạn đã sẵn sàng thử nghiệm máy cạo của mình trong môi trường Lambda tại địa phương và đóng gói mọi thứ

1. Bắt đầu docker

2. Trong thiết bị đầu cuối của bạn, hãy cd vào thư mục chứa các tệp Makefile và Docker của bạn. Tạo một thư mục có tên src và đặt tệp cạp Python của bạn vào đó

3. Chạy cái này

make docker-build

Thao tác này sẽ tạo môi trường Lambda dựa trên Dockerfile, docker-compose. yml bạn đã chỉnh sửa trước đó và các yêu cầu của bạn. tập tin txt. Nó cũng sẽ tải xuống tất cả các thư viện và tệp nhị phân cần thiết mà trình quét của bạn cần để chạy

4. Bây giờ, bạn đã có một phiên bản Lambda chạy trên máy của mình, hãy chạy tập lệnh của bạn

________số 8

Nó có hoạt động không? . Mã của bạn đã sẵn sàng để tải lên Lambda. Nếu không, bạn có một số sửa lỗi để làm

5. Tạo gói zip

make build-lambda-package

Điều này sẽ tạo ra ba thư mục

thùng rác. vị trí trình điều khiển web và tệp nhị phân Chrome của bạn
lib. các thư viện Python bạn cần [Selenium, v.v. ]
src. tập lệnh Python của bạn

Sau đó, nó sẽ nén mọi thứ vào một tệp có tên build. khóa kéo

Xin chào S3

Tệp kết quả sẽ quá lớn để tải trực tiếp lên Lambda vì tệp có giới hạn là 50MB. Vì vậy, bạn sẽ cần thêm nó vào bộ chứa S3 và cho Lambda biết nó ở đâu. Dán liên kết vào ô “URL liên kết S3” mà bạn đã để trống trước đó

Lưu và quan sát

Công cụ cạp Lambda của bạn đã sẵn sàng để triển khai. Nhấp vào nút “Lưu” màu cam lớn ở trên cùng và thế là xong. Nếu có lỗi, chúng sẽ xuất hiện trong nhật ký của bạn. Nhấp vào liên kết “Giám sát” ở đầu bảng điều khiển Lambda của bạn và cuộn đến hộp Lỗi

Chủ Đề