Как удалить стек с помощью бессерверного плагина greengrass? - PullRequest
0 голосов
/ 27 мая 2020

Я использую kepware для сбора данных и отправки их на AWS greengrass IoT Core. Я разворачиваю свой проект с помощью serverless и плагина 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, но я бы хотел удалить стек. Я попытался сбросить развертывание группы greengrass перед запуском: 'serverless remove ...' с помощью команды aws greengrass reset-deployments --group-id $GROUP_ID, но получаю ту же ошибку. Если я вручную удалю стек в облачной информационной консоли, моя группа greengrass будет удалена. (Я запускаю serverless remove --stage xxx, когда хочу изменить ветку в gitlab-ci). Кто-нибудь знает, почему я не могу удалить этот стек с serverless?

1 Ответ

0 голосов
/ 04 июня 2020

Давайте разделим вашу проблему на три части.

  1. Разверните лямбды
  2. Свяжите лямбды с одной или несколькими группами Greengrass
  3. Разверните обновленную группу Greengrass на своей цели устройства

У меня аналогичная установка работает последние 6-9 месяцев. Я не использовал один serverless для достижения всего этого.

Скорее, я использовал

  • serverless для # 1

  • serverless & cloudformation для # 2

  • ci/cd pipelines with aws cli для # 3

Я предпочитаю этот подход, потому что он позволял мне поддерживать 'stati c неизменные' ресурсы и 'динамически меняя ресурсы рядом друг с другом в монорепо, но обращайтесь с ними осторожно. Например, вы создаете группу Greengrass один раз, но в конечном итоге вы добавите / удалите подписки на различные темы в более поздний момент времени (несколько раз).

TL; DR

# 1 serverless Ограничьте его развертыванием / повторным развертыванием Lambdas с пакетами исходного кода и внедрением зависимостей et c.

# 2 serverless & cloudformation - это где я определите ресурсы AWS::Greengrass::FunctionDefinition и AWS::Greengrass::SubscriptionDefinition и захватите эти ресурсы, когда я хочу создать новое определение группы Greengrass.

# 3 ci/cd pipelines with aws cli - это то место, где я называю это 'Fla sh Устройство 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`

Ура!

...