Проблема:
При развертывании одного или нескольких сервисов с помощью serverless framework создается ведро, подобное этому: <<<your-service-name>>-<<stage>>-serverlessdeploymentbucket-12i2nulwb47go
, который содержит cloudformation template созданных нами ресурсов, заархивированный код и файл serverless-state.json
.
Поначалу это может не представлять проблемы, за исключением случаев, когда мы управляем несколькими сервисами и несколькими средами (например: dev,qa,stg
), которые могут легко превысить стандартный лимит в 100 ведер или даже жесткий лимит в 1000 ведер, кроме того, ими сложно управлять в случае, если вы больше не используете сервис и хотите его удалить.
Как решить эту проблему?
Serverless framework позволяет вам определить предопределенный bucket, который поможет нам централизовать все остальные bucket бессерверного развертывания в один. Плагин достаточно искусен, чтобы разделить наши сервисы на различные этапы в виде префиксов.
Давайте начнем с создания ведра S3 и хранилища Parameter store с именем ведра в качестве значения.
Примечание: я буду использовать aws cdk для создания этих ресурсов; можете пропустить эту часть. Если вы хотите узнать больше о cdk или о том, как его использовать, я рекомендую пройти этот семинар по CDK.
Создайте ведро, которое будет использоваться для централизации наших бессерверных развертываний. Установите публичный доступ для чтения как false и версионность как false (при желании вы можете включить ее, но это создаст разные версии объектов для каждого развертывания, что, возможно, не рекомендуется).
Создайте Parameter Store, который будет иметь в качестве значения имя нашего Bucket; это поможет нам определить имя Bucket в нашем serverless.yml
программно, так как мы можем использовать имя значения с переменной в другом регионе.
В нашем serverless.yml
мы добавляем эти строки, которые будут указывать на ведро, в котором находится наш код, ссылаясь на переменную, которую мы создали.
Примечание: В большинстве случаев нам не нужно устанавливать или добавлять плагин serverless-deployment-bucket.
provider:
name: aws
runtime: go1.x
stage: dev
region: us-east-1
deploymentBucket:
name: ${ssm(us-east-1):/GLOBAL/DEPLOYMENT_BUCKET}
После развертывания нашего сервиса мы заметили, что было создано два префикса, которые относятся к средам DEV и QA, что позволило нам сохранить два ведра в одном.
Однако что, если у нас есть разные сервисы в разных регионах? В этом случае ведра должны находиться в том же регионе, что и наши службы; в противном случае мы увидим эту ошибку.
Чтобы решить эту проблему, нам нужно создать ведро в том же регионе, что и наши службы, и создать еще один Parameter Store, который будет ссылаться на имя этого ведра.
Ссылка: Serverless Deployment Bucket