Проблема: лямбда не может использовать триггер s3, размещенный в Лондоне, если я разверну лямбду в Ирландии. В идеале я бы просто запустил экземпляр cloud9 в Лондоне, но этот сервис еще не доступен в Лондоне.
Cloud9 отлично подходит для тестирования и разработки лямбды, которая должна взаимодействовать с другими сервисами aws, код, требующий других сервисов aws, разработанных в локальной системе, необходимо изменить для развертывания, что, очевидно, не идеально. Поэтому я бы предпочел разработку с использованием cloud9 IDE.
В качестве временного решения, которое я разрабатывал, и на основе экземпляра EC2 в Ирландии, у меня есть скрипт, который копирует необходимые файлы для лямбды, архивирует их и отправляет в корзину s3. Затем я могу сгенерировать лямбду в любом месте и импортировать zip из корзины s3.
Однако, это кажется очень громоздким, должен быть лучший способ?
Вот примеры кода (1) лямбда
import json
import re
import boto3
import numpy
s3 = boto3.client('s3')
def lambda_handler(event, context):
"""DO SOMETHING"""
return {
'statusCode': 200,
'body': json.dumps('lambda run sucessfully')
}
(2) Python-скрипт для упаковки лямбды (которая вызывает bash-скрипт для zip) и отправки его на s3:
import os
import sys
import boto3
import subprocess
def package_lambda(packageName, pathToFiles):
"""Calls a bash script which packages the lambda function and
its dependencies into a zip"""
print('calling bash script')
subprocess.check_call(['/home/ec2-user/environment/shell_scripts/package_lambda.sh', packageName, pathToFiles])
print('bash script finished')
return
def moveFileToBucket(myfile, bucket):
"""pushes a file from the local system to an s3 bucket"""
if os.path.exists(myfile):
s3 = boto3.client('s3')
key=str(myfile).split('/')[-1]
s3.upload_file(myfile, bucket, key)
print("{} uploaded sucessfully".format(myfile))
else:
raise Exception('No file named: '+myfile)
return
if __name__=='__main__':
package_lambda(sys.argv[1], sys.argv[2])
moveFileToBucket(sys.argv[3], sys.argv[4])
(3) скрипт bash, вызываемый скриптом python для архивирования лямбды:
#!/bin/bash
packageName=$1
pathToFiles=$2
ext1="_package"
# print path incase debuggin is needed
ls -lt $pathToFiles
# set variables
lambda=$pathToFiles/$packageName/$packageName/lambda_function.py
lambda_packages=$pathToFiles/$packageName/
# Remove any previous copies of the package
rm -r $pathToFiles/$packageName$ext1
# print paths for logging/debuggin purposes
ls $lambda
ls $lambda_packages
# copy the lambda
cp -r $lambda_packages $pathToFiles/$packageName$ext1
# move the lambda for packaging
cp $lambda $pathToFiles/$packageName$ext1/lambda_function.py
# remove directories and files which are not needed for zip
rm -r $pathToFiles/$packageName$ext1/venv
rm -r $pathToFiles/$packageName$ext1/$packageName
rm $pathToFiles/$packageName$ext1/__init__.py
rm $pathToFiles/$packageName$ext1/template.yaml
rm $pathToFiles/$packageName$ext1/requirements.txt
# move into the package copy to zip
cd $pathToFiles/$packageName$ext1
zip -r ../lambda_function.zip *
Затем вызовите сценарий упаковки из командной строки, чтобы отправить его в корзину, чтобы его можно было развернуть в любом месте.
python3 /home/ec2-user/environment/pythonScripts/packageAndMoveFileToBucket.py myLambdaName /home/ec2-user/environment/pythonLambdaRepo /home/ec2-user/environment/pythonLambdaRepo/lambda_function.zip bucketForLambdas
Может быть, сообщество считает, что это очень хороший метод для решения этой проблемы? Но это кажется немного громоздким, и я не видел никакой документации от Amazon или где-либо еще, предлагающей «лучший» способ? Любой отзыв будет отличным?