Я только что написал лямбда-функцию Python, которая выполняет некоторые функции MySQL, а затем отправляет сообщение в SQS.Все это прекрасно работает локально, и сообщение успешно отправляется в SQS.
Я создаю SQS Client следующим образом:
sqsClient = boto3.client('sqs')
Однако после развертывания моей упакованной функции Lambda в AWS и ее запускавстроенная функция лямбда-теста.Я получаю следующую ошибку:
{
"errorMessage": "Unknown service: 'sqs'. Valid service names are: ",
"errorType": "UnknownServiceError",
"stackTrace": [
" File \"/var/lang/lib/python3.7/imp.py\", line 234, in load_module\n return load_source(name, filename, file)\n",
" File \"/var/lang/lib/python3.7/imp.py\", line 171, in load_source\n module = _load(spec)\n",
" File \"<frozen importlib._bootstrap>\", line 696, in _load\n",
" File \"<frozen importlib._bootstrap>\", line 677, in _load_unlocked\n",
" File \"<frozen importlib._bootstrap_external>\", line 728, in exec_module\n",
" File \"<frozen importlib._bootstrap>\", line 219, in _call_with_frames_removed\n",
" File \"/var/task/main.py\", line 20, in <module>\n sqsClient = boto3.client('sqs')\n",
" File \"/var/task/boto3/__init__.py\", line 91, in client\n return _get_default_session().client(*args, **kwargs)\n",
" File \"/var/task/boto3/session.py\", line 263, in client\n aws_session_token=aws_session_token, config=config)\n",
" File \"/var/task/botocore/session.py\", line 838, in create_client\n client_config=config, api_version=api_version)\n",
" File \"/var/task/botocore/client.py\", line 79, in create_client\n service_model = self._load_service_model(service_name, api_version)\n",
" File \"/var/task/botocore/client.py\", line 117, in _load_service_model\n api_version=api_version)\n",
" File \"/var/task/botocore/loaders.py\", line 132, in _wrapper\n data = func(self, *args, **kwargs)\n",
" File \"/var/task/botocore/loaders.py\", line 378, in load_service_model\n known_service_names=', '.join(sorted(known_services)))\n"
]
}
Моя первоначальная мысль заключалась в том, что, возможно, лямбда-версия boto3 еще не включает SQS.Я не думаю, что это проблема, так как я развертываю свою собственную версию boto и botocore.Я также добавил следующие строки в свою функцию, чтобы убедиться, что Lambda использует мою развернутую версию boto, а не встроенную версию:
print("boto3 version:"+boto3.__version__)
print("botocore version:"+botocore.__version__)
, которая выводит следующие версии:
boto3 version:1.9.87
botocore version:1.12.87
Это правильно и так же, как мои локальные версии.
Любая помощь будет оценена.Спасибо.
РЕДАКТИРОВАТЬ: В настоящее время я использую пакетный файл для развертывания моего кода, который выглядит следующим образом:
powershell.exe -nologo -noprofile -command "& {& Remove-Item .\deploy -Force -Recurse }"
mkdir deploy
powershell.exe -nologo -noprofile -command "& {& Get-ChildItem .\src -Exclude '__pycache__' | Copy-Item -Destination .\deploy }"
cd deploy
pipenv lock -r > dependencies.txt
pip install -r dependencies.txt --no-deps -t .
powershell.exe -nologo -noprofile -command "& {& Get-ChildItem . -Exclude '__pycache__' | Compress-Archive -DestinationPath deploy.zip -Force }"
aws lambda update-function-code --function-name API-LogUserInterest --zip-file fileb://deploy.zip
echo Deployment finished!
pause
Это создает папку "deploy" вмой рабочий каталог, установка там зависимостей, а также копирование моего исходного кода из папки "src".Затем вся эта папка развертывания архивируется с помощью powershell и передается в Lambda с помощью команды AWS CLI update-function-code
.
Вот снимок экрана с содержимым deploy.zip: