我有一个 ETL 流程,当我 docker-compose up 时,它只是启动该流程。
我将此映像与 AWS Fargate 一起使用,它运行完美。
现在,我想支持使用特定过滤器触发此 ETL。我想运行 ETL 并让它只更新我指定的特定活动。
我正在考虑使用 AWS Lambda,但经过一番研究后,我不确定如何将事件传递到我现有的 ETL 代码中。我需要修改我的 ETL 才能做到这一点吗?
如果我可以在触发 lambda 时提供环境变量,那就可以了,但我找不到方法来做到这一点。
TLDR:我有一个现有的 ETL docker 映像,我想在我的 AWS lambda 中使用它,但我不确定如何在现有代码中检索处理程序的有效负载。
注意:我不想要 2 个 docker 镜像,其中一个用于 Lambda,一个用于 Fargate,我想要两个都使用一个镜像,而不需要维护麻烦。
我使用fargate用boto3触发我的任务(你可以在lambda中使用它),我们用
传递参数 overrides = {"containerOverrides": [{"name": self.container_name, "command": container_command}]}
self.client = self.hook_ecs.get_client_type(region_name=self.region_name)
response = self.client.run_task(
cluster=self.cluster,
taskDefinition=self.task_definition,
launchType="FARGATE",
overrides=overrides,
startedBy=f"{self.target}_{self.command}",
networkConfiguration={
"awsvpcConfiguration": {
"subnets": self.subnets,
"assignPublicIp": "ENABLED", # keep it enabled otherwise will fail to pull the image
"securityGroups": self.security_groups,
}
},
)
然后你可以使用业务逻辑参数调用这个run_task,你的图像会收到这个参数,例如我的图像是这样的
FROM python:3.9.7-slim-buster
RUN pip install dbt-core
RUN pip install dbt-snowflake
COPY config/profiles.dist.yml /root/.dbt/profiles.yml
RUN dbt deps
请考虑到在我的示例中您可以拥有 python 脚本 (etl) 以及 dbt。我希望对你有帮助!!!
PD:发送容器的命令就像
dbt run