如何使用无服务器 greengrass 插件删除堆栈?

How can I remove a stack with serverless greengrass plugin?

我正在使用 kepware 收集数据并将其发送到 AWS greengrass IoT Core。我使用无服务器和插件 serverless-plugin-greengrass 部署我的项目。这是我的无服务器文件的一部分:

[...]
functions:
  opcuaPubSub:
    description: Lambda function for get data from kepware.
    handler: src.opcua_pub_sub.handler
    greengrass:
      subscriptions: 
        - target: cloud
          subject: topic/opcua

custom:
  output:
    file: stack.json
  pythonRequirements:
    usePipenv: true
  greengrass:
    autoDeploy: true
    groupId: ${env:GROUP_ID}
    defaults:
      pinned: true 
      memorySize: 262144
      encodingType: json 

plugins:
  - serverless-python-requirements
  - serverless-stack-output
  - serverless-pseudo-parameters
  - serverless-plugin-greengrass

但我无法使用无服务器删除堆栈。当我 运行: serverless remove --stage xxx 我有以下错误:

Greengrass: Execute reset for group id xxxxx-xxxx-xxxx-xxxx...

  Serverless Error ---------------------------------------

  That deployment type is not valid.  Please specify one of the following types: {NewDeployment,Redeployment}.

我不明白,因为 'serverless' 期待 NewDeployment 或 Redeployment,但我想要的是删除堆栈。我尝试使用命令 aws greengrass reset-deployments --group-id $GROUP_ID 在 运行: 'serverless remove...' 之前重置 greengrass 组的部署,但我得到了同样的错误。如果我在 cloudformation 控制台中手动删除堆栈,我的组 greengrass 将被删除。 (我 运行 serverless remove --stage xxx when I want to change branch in gitlab-ci)。 有人知道为什么我不能用无服务器删除这个堆栈吗?

让我们把你的问题分成三个部分。

  1. 部署 Lambdas
  2. 将 Lambda 关联到一个或多个 Greengrass 组
  3. 将更新后的 Greengrass 组部署到其目标设备

在过去的 6-9 个月里,我有一个类似的设置 运行。我没有单独使用 serverless 来实现所有这些。

相反,我使用了

  • serverless #1

  • serverless & cloudformation #2

  • ci/cd pipelines with aws cli #3

我更喜欢这种方法,因为它允许我在单一存储库中维护 'static unchanging' 资源和 'dynamically changing' 资源,但要小心处理它们。例如。您创建了一次 Greengrass 组,但您最终会在稍后的时间点(多次)adding/removing 订阅各种主题。

TL;博士

#1 serverless 将其限制为使用源代码包和依赖注入等部署/重新部署 Lambdas

#2 serverless & cloudformation 是我定义 AWS::Greengrass::FunctionDefinitionAWS::Greengrass::SubscriptionDefinition 资源的地方,并在我想创建新的 Greengrass 组定义时获取这些资源。

#3 ci/cd pipelines with aws cli 是我称之为 'Flash Greengrass Device' 的地方(涉及 2 个步骤,见下文)。他们几乎每次都有效。

# Retrieve Service Role Arn & grant exclusive permissions to Greengrass to use this role.
echo "Associating Greengrass Service Role to AWS Account.."
export GGG_ROLE_NAME=`aws2 cloudformation list-stack-resources --stack-name XXX | jq ".StackResourceSummaries[].PhysicalResourceId" --raw-output | grep YYY`
export GGG_ROLE_ARN=`aws2 iam get-role --role-name $GGG_ROLE_NAME | jq ".Role.Arn" --raw-output`
aws2 greengrass associate-service-role-to-account --role-arn $GGG_ROLE_ARN --region $AWS_DEFAULT_REGION

# Get Group ID, Group Version & Flash it!
export GGG_ID=`aws2 greengrass list-groups --query  "Groups[?Name=='XXX']" | jq ".[0].Id" --raw-output`
export GGG_VERSION_ID=`aws2 greengrass list-groups --query  "Groups[?Name=='XXX']" | jq ".[0].LatestVersion" --raw-output`
export GGG_DEPL_ID=`aws2 greengrass create-deployment --group-id $GGG_ID --group-version-id $GGG_VERSION_ID --deployment-type NewDeployment | jq ".DeploymentId"  --raw-output`
export GGG_DEPL_STATUS=`aws2 greengrass get-deployment-status --deployment-id $GGG_DEPL_ID --group-id GGG_ID | jq ".DeploymentStatus" --raw-output`

干杯!