Лучшая практика для развертывания AWS лямбда в другой регион, используя cloud9 - PullRequest
0 голосов
/ 25 января 2019

Проблема: лямбда не может использовать триггер 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 или где-либо еще, предлагающей «лучший» способ? Любой отзыв будет отличным?

1 Ответ

0 голосов
/ 31 января 2019

Похоже, вы хотите изменить Регион AWS, на который в данный момент установлена ​​среда AWS Cloud9, и затем развернуть функцию AWS Lambda в этом новом Регионе. Если это так, см. Следующие инструкции, которые описывают, как изменить регион: https://docs.aws.amazon.com/cloud9/latest/user-guide/lambda-functions.html#lambda-functions-prepare-region

...