10

我在 serverless.yml 文件中定义了以下资源。它为我所有不同的发展阶段创造资源非常有用。

resources:
  Resources:
    uploadBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:service}-${self:custom.stage}-uploads
    visitsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:custom.visitsTable}
        AttributeDefinitions:
          - AttributeName: userId
            AttributeType: S
          - AttributeName: visitId
            AttributeType: S
        KeySchema:
          - AttributeName: userId
            KeyType: HASH
          - AttributeName: visitId
            KeyType: RANGE
        ProvisionedThroughput:
            ReadCapacityUnits: ${self:custom.dynamoDbCapacityUnits.${self:custom.stage}}
            WriteCapacityUnits: ${self:custom.dynamoDbCapacityUnits.${self:custom.stage}}

问题是......如果我sls remove在删除数据库时这样做,它也会删除其他所有内容,包括 lambda 函数及其 api 网关端点,我需要保留这些端点,因为我为它们明确设置了策略。 如何告诉无服务器我只想删除数据库或 S3 或其他任何内容,而不是其余部分?

我尝试过的事情:

我在 AWS 上手动删除,但如果你这样做并执行 sls deploy 它不会再次创建数据库!所以不确定最好的方法......

整个 Serverless.yml 文件

service: mydomain-api

# Use serverless-webpack plugin to transpile ES6/ES7
plugins:
  - serverless-webpack
  - serverless-domain-manager

custom:
  webpackIncludeModules: true
  stage: ${opt:stage, self:provider.stage}
  visitsTable: "${self:service}-visits-${self:custom.stage}"
  domains:
    prod: api.mydomain.com
    staging: staging-api.mydomain.com
    dev: dev-api.mydomain.com
  dynamoDbCapacityUnits:
    prod: 5
    staging: 2
    dev: 2
  customDomain:
    basePath: ""
    domainName: ${self:custom.domains.${self:custom.stage}}
    stage: "${self:custom.stage}"
    certificateName: "mydomain.com"
    createRoute53Record: true

provider:
  name: aws
  runtime: nodejs6.10
  stage: prod
  region: us-east-1
  environment:
    VISITS_TABLE: ${self:custom.visitsTable}

  # 'iamRoleStatement' defines the permission policy for the Lambda function.
  # In this case Lambda functions are granted with permissions to access DynamoDB.
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: "arn:aws:dynamodb:us-east-1:*:*"

functions:
  create:
    handler: src/visits/create.main
    events:
      - http:
          path: visits
          method: post
          cors: true
          authorizer: aws_iam
  get:
    handler: src/visits/get.main
    events:
      - http:
          path: visits/{id}
          method: get
          cors: true
          authorizer: aws_iam
  list:
    handler: src/visits/list.main
    events:
      - http:
          path: visits
          method: get
          cors: true
          authorizer: aws_iam
  update:
    handler: src/visits/update.main
    events:
      - http:
          path: visits/{id}
          method: put
          cors: true
          authorizer: aws_iam
  delete:
    handler: src/visits/delete.main
    events:
      - http:
          path: visits/{id}
          method: delete
          cors: true
          authorizer: aws_iam

resources:
  Resources:
    uploadBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:service}-${self:custom.stage}-uploads
    visitsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:custom.visitsTable}
        AttributeDefinitions:
          - AttributeName: userId
            AttributeType: S
          - AttributeName: visitId
            AttributeType: S
        KeySchema:
          - AttributeName: userId
            KeyType: HASH
          - AttributeName: visitId
            KeyType: RANGE
        ProvisionedThroughput:
            ReadCapacityUnits: ${self:custom.dynamoDbCapacityUnits.${self:custom.stage}}
            WriteCapacityUnits: ${self:custom.dynamoDbCapacityUnits.${self:custom.stage}}
4

3 回答 3

11

服务器框架文档对以下内容进行了说明sls remove

sls remove命令将从提供程序中删除在当前工作目录中定义的已部署服务。

所以sls remove不是要走的路。只需visitsTable从您的资源中删除serverless.yaml并再次运行sls deploy。无服务器框架在后台使用 AWS CloudFormation。所以手动删除东西不是一个好主意。请记住:作为 AWS CloudFormation 堆栈的一部分创建的资源必须通过堆栈更新进行管理和修改。也许这是一本好书:https ://virtualbonzo.com/2017/12/11/did-you-manually-delete-a-resource-created-by-aws-cloudformation/

于 2018-09-06T06:30:33.100 回答
3

在堆栈删除时不希望删除的资源上将 DeletionPolicy 设置为“保留”,其余的将在您运行时被删除sls remove

resources:
  Resources:
    uploadBucket:
      Type: AWS::S3::Bucket
      DeletionPolicy: Retain
      ...

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html

于 2018-11-15T23:18:00.040 回答
2

无服务器框架生成一个 CloudFormation 模板。

首次运行 CloudFormation 模板时,它会创建所有资源。

当您将来运行它时,它会将新版本与以前的版本进行比较,并生成一个弥补差异的计划。这可能是添加或删除资源。对此有一些例外,通常是数据资源类型,如 S3 存储桶,需要强制删除。

serverless.yml因此,要回答您的问题,您应该从文件中删除不再需要的资源,然后再执行sls deploy一次。

于 2018-10-10T17:08:35.563 回答