亚马逊AWS官方博客

如何将 AWS Lambda 与 Spinnaker 集成

2018 年中期,AWS 就开始助力 Netflix 的一个备受期待的开源项目 Spinnaker。Spinnaker 是一个基于云的持续交付平台,用于快速可靠地发布软件更改。借助 Spinnaker,开发人员可以专注于编写代码和部署应用程序,而无需为底层基础设施而费心。Spinnaker 可与 Git、Jenkins 和 TravisCI 等工具无缝集成。使用 Spinnaker,您可以灵活地在云中或您选择的容器平台(如 Amazon Elastic Container Service (Amazon ECS) 或 Amazon Elastic Kubernetes Service (Amazon EKS))中运行的虚拟机上部署应用程序。AirbnbPinterestSnapAutodeskSalesforce 等 AWS 客户都在使用 Spinnaker 为开发人员安全可靠地部署应用程序铺平道路。

2019 年,AWS 将重点放在了 Spinnaker 的多项重要增强功能上。在过去的几个月里,我们与 Netflix 的交付工程团队合作,为 Spinnaker 添加了全新的函数计算基元,以便您可以通过 Spinnaker UI 本身管理和部署 AWS Lambda 函数。Autodesk 的工程运营经理 Brandon Leach 发表了题为 Organizational Challenges of Implementing Continuous Delivery with Spinnaker 的演讲,介绍了 AWS Lambda 与 Spinnaker 的集成将如何为他们的开发人员社区提供帮助。去年,AWS 团队在圣迭戈举行的 Spinnaker 峰会上发表了演讲;Spinnaker on AWS: A State of the Union (AWS) 演讲录像可让您更深入地了解我们正在从事的工作。

我们来进一步了解一下如何将 AWS Lambda 与 Spinnaker 集成。

先决条件

首先,您必须具备可正常运行的 Spinnaker 环境,Amazon EKS 是设置此环境的绝佳平台。如需详细了解如何执行此操作,请参阅 Irshad Buchh 所写的文章 Continuous Delivery using Spinnaker on Amazon EKS

启用 AWS Lambda Clouddriver

要启用 AWS Lambda 支持,我们必须更新 Spinnaker 配置。Halyard 是 Spinnaker 的配置管理工具,它支持自定义配置文件。我们将创建一个启用 AWS Lambda 的自定义Halyard Clouddriver 配置文件。

我们将创建一个 clouddriver-local.yml 文件,以扩展我们的配置。此“-local”名称会将更改添加到我们现有的 clouddriver 配置中,并启用 AWS Lambda 支持。

首先,登录用于配置 Halyard 的主机,并创建以下文件:

vi ~/.hal/default/profiles/clouddriver-local.yml

clouddriver-local.yml 中添加以下行,替换相应参数以匹配您的配置 (accountId, regions, assumeRole):

aws:
  lambda:
 enabled: true
 accounts:
 - name: test
    lambdaEnabled: true
    accountId: 'xxxxxxxxxxxx'
    regions: 
    - name: us-west-2
    - name: us-east-1
    assumeRole: role/your-custom-role-name

有关 API 的更多详细信息,请参阅 AWS Lambda 支持文档
接下来,您必须启用新函数 UI。函数管理是作为基于标志的自定义功能推出的,默认情况下处于禁用状态。

要覆盖此生成的设置并提供自定义设置,我们必须启用该标志:

vi ~/.hal/default/profiles/settings-local.js

添加以下行:

window.spinnakerSettings.feature.functions = true

现在,您的配置应该如下所示:

$ cat ~/.hal/default/profiles/settings-local.js
window.spinnakerSettings.feature.functions = true

部署您的 Halyard 更改:

$ hal deploy apply

验证您的 Kubernetes Pod 是否已启动并正在运行:

ubuntu:~/.hal/default/profiles$ kubectl get pods -n spinnaker
NAME READY  STATUS RESTARTS  AGE
spin-clouddriver-6f4d9946c6-gblmg  1/1  Running  0 1d
spin-deck-86588476cb-kn926 1/1  Running  0 1d
spin-echo-54d9b97449-8h2gz 1/1  Running  0 1d
spin-front50-55d7995ffb-nzwdh  1/1  Running  0 1d
spin-gate-d8584db7f-h5cj9  1/1  Running  0 1d
spin-igor-69d6b458ff-7ntr9 1/1  Running  0 1d
spin-orca-7877865879-9lgzv 1/1  Running  0 1d
spin-redis-77f74664b5-p8whk  1/1  Running  0 1d
spin-rosco-658985dd44-mc2j9  1/1  Running  0 1d

您可以根据需要进一步对 Pod 进行问题排查:

kubectl logs -f -n spinnaker spin-clouddriver-xxxx

部署了最新版本的 Deck(即 Spinnaker UI)并满足了上述要求后,您会注意到每个应用程序中都会显示函数选项卡。以下屏幕截图提供了一个示例:

每个 Spinnaker 应用程序中的*“函数”*选项卡的屏幕截图

在 Spinnaker 中使用 AWS Lambda

创建 AWS Lambda 函数

要创建新的 AWS Lambda 函数,请导航至函数选项卡,然后单击创建函数按钮。在创建新函数表单中填写相应详细信息,如函数名称运行时S3 存储桶S3 键处理程序,以及用于发布的选项。填写完表单后,您可以单击创建按钮,这样 AWS Lambda 函数就创建好了。然后,您可以导航到 AWS 控制台并查看新创建的 AWS Lambda 函数。

AWS 控制台显示新创建的 AWS Lambda 函数

下面的 AWS 控制台屏幕截图显示了由 Spinnaker 创建的新 AWS Lambda 函数。请注意由 Spinnaker 创建的新 AWS Lambda 函数是如何以 Spinnaker 应用程序的应用程序名称为前缀的。

由 Spinnaker 创建的新 AWS Lambda 函数以 Spinnaker 应用程序的应用程序名称为前缀

通过 Spinnaker UI 查看 AWS Lambda 函数

导航到与某个应用程序对应的函数选项卡之后,您将看到列出的与该应用程序对应的可用函数。单击任一可用函数可显示函数详细信息,例如上次修改时间、VPC 和函数 ARN。

单击任一可用函数可显示函数详细信息,例如上次修改时间、VPC 和函数 ARN。

更新 AWS Lambda 函数

单击与某个 AWS Lambda 函数对应的函数操作按钮,即可访问编辑函数详细信息页面。

单击与某个 AWS Lambda 函数对应的*“函数操作”*按钮,即可访问*“编辑函数”*详细信息页面。

进入“编辑函数”屏幕之后,您可以编辑详细信息,然后单击更新按钮,此操作会在后台调用更新函数 API,而函数几乎会即时更新。您可以再次导航到 AWS 控制台,看看更新是否已在控制台中体现出来。

AWS 控制台会显示更新是否已体现出来

删除 AWS Lambda 函数

单击与某个 AWS Lambda 函数对应的函数操作按钮,即可访问删除函数按钮。单击删除函数按钮后,系统会提示您确认删除,在您确认后,函数就会被删除。要验证此操作,您可以导航到 AWS Lambda 控制台并列出现有函数。

要验证此操作,您可以导航到 AWS Lambda 控制台并列出现有函数。

ALB 与 AWS Lambda 函数集成

去年,我们宣布支持 AWS Lambda 作为 Application Load Balancer (ALB) 目标,这是我们添加的另一项重要功能,它成为我们为上游所做的最新贡献的一部分。在 Spinnaker 内,许多客户利用 Elastic Load Balancing 来构建可扩展的应用程序。自今日起,客户现在能够通过 Spinnaker UI 将 AWS Lambda 函数注册为 ALB 目标组的目标类型。

第 1 步:创建以 AWS Lambda 为目标类型的目标组

在 Spinnaker UI 中,导航到负载均衡器创建控制台。选择 AWS 为提供商,ALB 为负载均衡器类型。继续创建目标组,您会注意到列表中已添加一个新的目标类型 lambda。选择 lambda 作为目标类型。将“路径”从 /healthcheck 更改为 /,然后单击创建。这样即会创建 ALB,以及以 AWS Lambda 为目标类型的目标组。

将“路径”从*“/healthcheck”*更改为“/”,然后单击*“创建”*。这样即会创建 ALB,以及以 AWS Lambda 为目标类型的目标组。

第 2 步:将函数与目标组关联

导航到“函数”选项卡,然后尝试创建一个函数或更新现有函数的详细信息。在本例中,我们来尝试创建一个新函数。创建新函数屏幕包含目标组名称字段。粘贴“第 1 步”中创建的目标组名称,然后继续创建 AWS Lambda 函数。

粘贴“第 1 步”中创建的目标组名称,然后继续创建 AWS Lambda 函数。

您可以导航到 AWS EC2 控制台,看看 AWS Lambda 函数是否已与目标组关联。

您可以导航到 AWS EC2 控制台,看看 AWS Lambda 函数是否已与目标关联。

注意:如果要将现有函数与目标组关联,则必须明确授予目标组调用 AWS Lambda 函数的权限。这尚未纳入我们的实施流程,但已在我们的未来发展路线图中。权限可以通过 AWS CLI 授予,如下所示:

`aws AWS Lambda add-permission \ --function-name AWS Lambda-function-arn-with-alias-name \ --statement-id elb1 \ --principal elasticloadbalancing.amazonaws.com \ --action AWS Lambda:InvokeFunction \ --source-arn target-group-arn`

局限与未来发展

我们花费了大量时间在 Spinnaker 中启用 AWS Lambda 功能,但是目前尚未达到预期。我们将继续改善用户体验,例如为 AWS Lambda 配置参数(如 IAM 角色、目标组等)提供下拉值。展望未来,我们希望为 AWS Lambda 添加本地管道支持。在此期间,我们的一个合作伙伴撰写了一篇值得一看的文章,即 AWS Lambda & Custom Webhook Stages,其中解释了如何扩展 Spinnaker 管道以支持 AWS Lambda。

如果您在 AWS 对 Spinnaker 的贡献方面有任何其他问题或反馈,请通过 spinnaker-team@amazon.com 给我们留言。

精选图片来自 Pixabay。