0

我正在使用 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}.

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

4

1 回答 1

0

让我们将您的问题分为三个部分。

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

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

相反,我用

  • serverless#1

  • serverless & cloudformation#2

  • ci/cd pipelines with aws cli#3

我更喜欢这种方法,因为它允许我在单一存储库中保持“静态不变”资源和“动态变化”资源彼此相邻,但要小心处理它们。例如,您创建了一次 Greengrass 组,但您最终会在稍后的时间点(多次)添加/删除对各种主题的订阅。

TL; 博士

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

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

#3ci/cd pipelines with aws cli是我称之为“Flash Greengrass 设备”的地方(包括 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`

干杯!

于 2020-06-04T05:58:53.257 回答