serverless-s3-local 写入真正的 S3 存储桶

serverless-s3-local writing to real S3 bucket

我在开发过程中使用带有 serverless-s3-local 插件的无服务器框架来测试我的代码。然而,尽管处于离线模式,但正在写入真正的 S3 存储桶。我如何更改我的配置以在离线模式下使用本地伪造的 s3 存储桶?

相关 serverless.yml 部分:

plugins:
  - serverless-stack-output
  - serverless-plugin-include-dependencies
  - serverless-layers
  - serverless-deployment-bucket
  - serverless-s3-local
  - serverless-offline
custom:
  #...
  s3:
    bucketName: test-s3-buck
    host: localhost
  serverless-offline:
    ignoreJWTSignature: true
    httpPort: 4000
    noAuth: true
    directory: /tmp
resources:
  Resources:
    #...
    Bucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: ${self:custom.s3.bucketName}

端点调用 S3:

import boto3


def post(event, context):
    s3_path = "/test.txt"
    body = "test"
    encoded_string = body.encode("utf-8")

    s3 = boto3.resource("s3")
    bucket_name = "test-s3-buck"
    s3.Bucket(bucket_name).put_object(Key=s3_path, Body=encoded_string)

    response = {
        "statusCode": 200,
        "body": "Created."
    }
    return response

启动无服务器脱机:

serverless offline start

serverless-s3-local 中的自述文件中,我们有:

  const S3 = new AWS.S3({
    s3ForcePathStyle: true,
    accessKeyId: 'S3RVER', // This specific key is required when working offline
    secretAccessKey: 'S3RVER',
    endpoint: new AWS.Endpoint('http://localhost:4569'),
  });

你可以实现the same withboto:

import boto3

client = boto3.client(
    's3',
    aws_access_key_id='S3RVER',
    aws_secret_access_key='S3RVER'
)

这意味着,当您 运行 您的 serverless offline start 时,您需要将 aws 访问密钥 ID 设置为 S3RVER 并将 aws 秘密访问密钥设置为 S3RVER,否则,将使用真正的桶。

同样在自述文件中,有设置 s3local aws 配置文件的说明,https://github.com/ar90n/serverless-s3-local#triggering-aws-events-offline

实现它的另一种方法是 运行 你的带有环境变量的命令:

AWS_ACCESS_KEY_ID=S3RVER AWS_SECRET_ACCESS_KEY=S3RVER serverless offline start

这样,代码中的 aws-sdk 将读取离线模式的正确值