2

Мне интересно, можно ли использовать serverless.yml для создания ведра и добавить к нему определенный файл во время развертывания безсерверной рамки.Как мы можем использовать serverless.yml для создания ведра AWS S3 и добавить к нему файл?

До сих пор я мог добавить ресурс S3, который создает ведро, но не уверен, как добавить определенный файл.

resources: 
    Resources: 
    UploadBucket: 
     Type: AWS::S3::Bucket 
     Properties: 
     BucketName: ${self:custom.s3.bucket} 
     AccessControl: Private 
     CorsConfiguration: 
      CorsRules: 
      - AllowedMethods: 
      - GET 
      - PUT 
      - POST 
      - HEAD 
      AllowedOrigins: 
      - "*" 
      AllowedHeaders: 
      - "*" 

Не уверен, если это возможно, или как использовать serverless.yml для загрузки файла по умолчанию в процессе развертывания, если это еще не там.

ответ

3

Там нет официального AWS CloudFormation ресурса, который будет управлять (добавлять/удалять) индивидуальный S3 объектом в ведре, но вы можете создать с Custom Resource, которая использует функцию Lambda для вызова API, в PUT Object/DELETE Object с помощью AWS SDK для NodeJS.

Вот полный шаблон пример CloudFormation:

Launch Stack

Description: Create an S3 Object using a Custom Resource. 
Parameters: 
    BucketName: 
    Description: S3 Bucket Name (must not already exist) 
    Type: String 
    Key: 
    Description: S3 Object Key 
    Type: String 
    Body: 
    Description: S3 Object Body 
    Type: String 
Resources: 
    Bucket: 
    Type: AWS::S3::Bucket 
    Properties: 
     BucketName: !Ref BucketName 
    S3Object: 
    Type: Custom::S3Object 
    Properties: 
     ServiceToken: !GetAtt S3ObjectFunction.Arn 
     Bucket: !Ref Bucket 
     Key: !Ref Key 
     Body: !Ref Body 
    S3ObjectFunction: 
    Type: AWS::Lambda::Function 
    Properties: 
     Description: S3 Object Custom Resource 
     Handler: index.handler 
     Role: !GetAtt LambdaExecutionRole.Arn 
     Code: 
     ZipFile: !Sub | 
      var response = require('cfn-response'); 
      var AWS = require('aws-sdk'); 
      var s3 = new AWS.S3(); 
      exports.handler = function(event, context) { 
      var respond = (e) => response.send(event, context, e ? response.FAILED : response.SUCCESS, e ? e : {}); 
      var params = event.ResourceProperties; 
      delete params.ServiceToken; 
      if (event.RequestType == 'Create' || event.RequestType == 'Update') { 
       s3.putObject(params).promise() 
       .then((data)=>respond()) 
       .catch((e)=>respond(e)); 
      } else if (event.RequestType == 'Delete') { 
       delete params.Body; 
       s3.deleteObject(params).promise() 
       .then((data)=>respond()) 
       .catch((e)=>respond(e)); 
      } else { 
       respond({Error: 'Invalid request type'}); 
      } 
      }; 
     Timeout: 30 
     Runtime: nodejs4.3 
    LambdaExecutionRole: 
    Type: AWS::IAM::Role 
    Properties: 
     AssumeRolePolicyDocument: 
     Version: '2012-10-17' 
     Statement: 
     - Effect: Allow 
      Principal: {Service: [lambda.amazonaws.com]} 
      Action: ['sts:AssumeRole'] 
     Path:/
     ManagedPolicyArns: 
     - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" 
     Policies: 
     - PolicyName: S3Policy 
     PolicyDocument: 
      Version: '2012-10-17' 
      Statement: 
      - Effect: Allow 
       Action: 
       - 's3:PutObject' 
       - 'S3:DeleteObject' 
       Resource: !Sub "arn:aws:s3:::${BucketName}/${Key}" 

Вы должны быть в состоянии использовать эти ресурсы в файле в serverless.yml конфигурации, хотя я не уверен, как именно Serverless интегрируется с Ресурсы/параметры CloudFormation.