一个调用的故事 - 使用AWS lambda将文件从AWS S3传输到Azure Blob存储
#aws #python #s3 #lamba

几天前,我决定扫描一个流行的自由职业网站,以解决一个有趣的问题,而无需申请工作,因为Lady Luck会遇到它,我偶然发现了一个有趣的挑战,客户需要从使用Power Automate的S3存储桶到Azure Blob存储。似乎是一项相当容易的任务吗?

我从阅读Microsoft Docs并审查Amazon S3电源平台连接器开始。

在使用连接器时,有一个警告,因为Microsoft明确表示需要小于3.5 MB的对象尺寸的限制,而在低代码开发平台上可以预期。

这似乎是使用Python建立Lambda功能的绝佳机会。

在这篇文章中,我将向您展示如何创建一个lambda函数,该函数将文件上传到S3并使用lambda层用于包装库,该库将由Lambda函数使用。

先决条件:

AWS帐户
•Amazon S3桶
•Azure订阅
•Azure存储帐户
•Docker

这篇文章假设您已经在AWS中创建了一个S3存储桶和一个带有容器的Azure存储帐户。如果您熟悉pulumi,我已经包括了pulumi程序,以在下面的回购中在两个云中创建所需的资源:

lambda-s3-to-blob

步骤1:创建IAM执行角色

我们将在下一步中创建的lambda函数将需要访问S3的权限并将权限写入CloudWatch日志。

iam 控制台,然后选择角色 访问管理从左侧 - menu中,选择创建角色< /strong>按钮,从后续页面加载选择 aws服务作为可信的实体类型 lambda 作为用例< /strong>。在添加权限页面上,您需要搜索并选择以下权限的复选框:

Amazons3ReadonLyAccess
awslambdabasicexecutionrole

提供角色的名称,例如 s3toazureblobrole 并最终确定角色的创建。

IAM Role Creation

步骤2:创建一个lambda功能

导航到lambda控制台,然后选择创建功能按钮。

选择从头开始的作者,在基本信息下部分提供了函数的名称。 s3toazureblob ,然后在运行时选择 python 3.9 下拉下。

架构下选择 x86_64

我们需要扩展权限并确保使用现有角色可以从下拉下选择您先前创建的角色(s3toazureblobrole)。 。选择创建功能按钮。

AWS Lambda Console

在“代码”选项卡下,您需要用以下所示代码替换控制台编辑器中显示的代码:

import boto3
import botocore
import os
import tempfile
from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient
from azure.core.exceptions import ClientAuthenticationError, ServiceRequestError

s3 = boto3.resource('s3')

# Credentials for accessing Azure Blob Storage
storage_account_key = os.environ.get('storage_account_key')
storage_account_name = os.environ.get('storage_account_name')
connection_string = os.environ.get('connection_string')
container_name = os.environ.get('container_name')

def lambda_handler(event, context):
    # Get temp file location when running
    temFilePath = tempfile.gettempdir()

    # Change directory to /tmp folder
    os.chdir(temFilePath)

    for record in event['Records']:
        # Get bucket and key from s3 trigger event
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']

        # Get file name from key, join /tmp folder path and file name
        file_name = key
        upload_file_path = os.path.join(temFilePath, file_name)

        try:
            # Download the object from s3
            s3.meta.client.download_file(bucket, key, key)

            def upload_to_blob_storage(file_path, file_name):
                """Upload file to Azure storage as blob from /tmp folder"""
                blob_service_client = BlobServiceClient.from_connection_string(connection_string)
                blob_client = blob_service_client.get_blob_client(container=container_name, blob=file_name)

                with open(file_path, "rb") as data:
                    blob_client.upload_blob(data, overwrite=True)
                    print(f" {file_name} uploaded to Azure Blob !")

            upload_to_blob_storage(upload_file_path, file_name)

        except FileNotFoundError:
            print(f"The file {key} does not exist")
        except botocore.exceptions.ClientError as error:
            print(error.response['Error']['Code'], error.response['Error']['Message'])
        except ClientAuthenticationError as e:
            print(f"Error uploading file: {e}")
        except ServiceRequestError as e:
            print(f"Error uploading file: {e}")

保存更改并选择部署按钮。

步骤3:创建一个S3触发器

触发器是调用您功能的服务或资源。我们将使用S3用作每次将对象上传到S3桶时调用我们功能的来源。

触发配置下>,确保选择递归调用下的复选框,然后选择 add 按钮以完成触发配置。

S3 Trigger

步骤4:创建一个lambda层

lambda层允许您打包您功能将使用的其他库。我们的功能将利用Azure库(Azure-Storage-Blob,Azure-Core)与Python代码的Azure Services进行通信。

您需要在本地创建与Python 3.9兼容的以下目录结构,以与Docker创建模拟的Lambda环境。

├── requirements.txt
└── python/
    └── lib/
        ├── python3.9/
        │   └── site-packages/

在需求.txt文件中,通过在文件中添加以下行,指定Azure存储blobs客户端库以及python的azure core共享客户端库。

azure-storage-blob
azure-core

确保Docker守护程序正在运行。您需要将lambda函数要求的库依赖关系安装给先前创建的子文件夹。输入以下命令:

docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.9" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"

下载了依赖项后,您将需要将Python文件夹的内容汇总。

zip -r azurelib.zip python > /dev/null

从您的浏览器中导航到Lambda控制台,并通过选择页面左上角的汉堡菜单来展开侧面菜单。选择 其他资源。选择创建图层按钮,您需要为图层提供名称,上传zipped文件包含我们功能与Azure交互所需的库,然后选择 create 一旦提供了强制性信息。

Create Lambda Layer

导航到您之前创建的功能,向页面底部滚动,然后选择 layers layers 部分下添加图层。选择自定义图层,选择您之前创建的图层并选择版本。

Add Lambda Layer

步骤5:添加环境变量

选择配置选项卡,选择环境变量,选择编辑按钮,然后选择添加环境变量,您需要使用访问Azure Blob存储所需的凭据来填充密钥/值对。

Add Environment Variables

登录到Azure门户以检索存储帐户的访问键。

Azure Storage Account Credentials

要测试解决方案是否有效,您可以将文件上传到S3存储桶,然后可以查看所有日志事件的 CloudWatch 日志。

CloudWatch Log Events

您还可以检查Azure存储帐户中的容器是否具有上传文件。

Azure Storage Container Items

选修的

您可能需要将超时增加到15秒以否定功能的时间,您还可以将短暂存储从512 MB增加到更高的容量,到10 GB。

结论

可以在自由职业网站上找到新项目创意的最佳来源。这种方法导致一种更有机的学习方法。

感谢您的阅读,我希望您学到了一些新知识。