Использование maven для создания пакета развертывания python для aws lambda

В настоящее время я работаю над развертыванием пакета python на aws lambda. Используя инструменты virtualenv и zip, я могу легко создать zip-файл lambda, чтобы загрузить его в aws и запустить. Я использую следующий блог для создания пакета: https://joarleymoraes.com/hassle-free-python-lambda-deployment/.

Однако мне нужно использовать инструмент сборки для интеграции моего кода с Jenkins в моей компании. Мы используем maven для сборки, и мне нужно следовать тому же.

Я просмотрел maven-exec-plugin, чтобы узнать, как я могу следовать шаги в блоге, чтобы использовать виртуальную среду и создать zip-файл. Однако я не могу выполнить шаги, упомянутые в учебнике по maven.

Кто-нибудь сталкивался с такой же проблемой? Если да, то как вы ее решили? Например, как вы настроили свой pom.xml для создания пакета развертывания для python aws lambdas?

Быстрая помощь будет высоко оценена. Спасибо


person Omkar    schedule 15.02.2018    source источник


Ответы (1)


Позвольте мне разбить этот вопрос на две части. Во-первых, для лямбды Python вам нужно создать zip-файл. Для этого я рекомендую использовать плагин сборки Maven.

Образец pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.mygroup</groupId>
        <artifactId>parent-pom</artifactId>
        <version>0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <artifactId>LambdaInstall</artifactId>
    <name>Python Lambda Installation Package</name>
    <packaging>pom</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <build>
        <plugins>
          <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
              <execution>
                <id>install-assembly</id>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
                <configuration>
                  <appendAssemblyId>false</appendAssemblyId>
                  <descriptors>
                    <descriptor>assembly.xml</descriptor>
                  </descriptors>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
    </build>
</project>

Образец сборки.xml:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
  <id>lambda-zip</id>
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <fileSets>
      <fileSet>
        <directory>src/main/python</directory>
        <outputDirectory></outputDirectory>
      </fileSet>
  </fileSets>
</assembly>

Если ваша лямбда использует только стандартные библиотеки Python, то это все, что вам нужно. Сложность возникает, когда вам нужен boto3 или какая-либо другая библиотека, которую AWS не устанавливает предварительно на свои лямбда-узлы. Для этого вы должны добавить свои библиотеки в свой zip-файл.

Мне нужен был способ сделать это так, чтобы он работал на ПК любого разработчика или даже на узле Jenkins, поэтому я написал небольшое приложение на Python, которое находит расположение библиотеки (в каталоге site-packages) и копирует его в приложение. целевой каталог. В этом примере мне понадобился jwt:

import jwt
import distutils
from distutils import dir_util

# This will copy the jwt package into the target directory so it is included in the zip file
jwtPath = jwt.__path__[0]
distutils.dir_util.copy_tree(jwtPath, "./target/jwt")

Эта программа Python вызывается путем добавления плагина Maven Exec в мой файл pom.xml:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>python-build</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>exec</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
       <executable>python</executable>
       <arguments>
            <argument>src/main/python/build/copyjwt.py</argument>
       </arguments>    
    </configuration>
</plugin>

Теперь, чтобы скопировать код в мой zip-файл, мне нужно всего лишь добавить еще один набор файлов в файл Assembly.xml, который я показал выше:

<fileSet>
    <directory>target/jwt</directory>
    <outputDirectory>jwt</outputDirectory>
</fileSet>
person mojoken    schedule 22.10.2018
comment
это именно то, что мне было нужно. Спасибо за это @mojoken - person Omkar; 23.10.2018
comment
Звучит здорово, но что, если нужная библиотека еще не установлена? (То есть не кажется разумным предполагать, что узел Jenkins будет иметь все эзотерические библиотеки, которые нам могут понадобиться) - person MartinThurn; 28.02.2019
comment
@MartinThurn, вы правы, и я обнаружил такие случаи после того, как написал этот ответ. В конечном итоге я создал небольшой каталог site-packages в своем проекте и проверил некоторые из моих сторонних библиотек в системе управления версиями, чтобы они были доступны на моем сервере Jenkins. - person mojoken; 02.03.2019