AWS存储系统

由 The Right Honourable Reverend (trhr) 提供的贡献,2020年

此插件将 Evennia 的基于 Web 的部分迁移到 Amazon AWS(S3)云托管,主要涉及图像、JavaScript 和其他位于 staticfiles 中的项目。非常适合那些在游戏中提供媒体的服务器。

托管在 S3 上的文件位于“云端”,虽然你的个人服务器可能足够支持少量用户的多媒体服务,但此插件的完美用例为:

  • 支持大量基于 Web 的流量的服务器(Web客户端等)…

  • 用户数量庞大…

  • 用户分布在全球…

  • 在游戏中向用户提供多媒体文件

底线是:如果每次玩家穿越地图时都要发送图像,使用此插件将大幅减少带宽消耗。如果没有,可能可以跳过此贡献。

关于成本

请注意,通过 S3 存储和提供文件并不是在亚马逊的“免费套餐”外技术上免费的,你可能会合格也可能不合格;当前,设置一个简单的 Evennia 服务器需要在 S3 上占用 1.5MB 的存储空间,使得运行此插件的当前总成本约为每年 ~$0.0005。如果你拥有大量媒体资产并打算向许多用户提供它们,请注意总体拥有成本 - 检查 AWS 的定价结构。

技术细节

这是一个直接的替换插件,操作深于 Evennia 的所有代码,因此你的现有代码无需改变即可支持它。

例如,当 Evennia(或 Django)试图永久保存文件(例如,用户上传的图像)时,保存(或加载)通信遵循以下路径:

Evennia -> Django
Django -> 存储后端
存储后端 -> 文件存储位置(例如,硬盘)

django docs

启用此插件后,它将覆盖默认的存储后端,默认情况下保存文件到 mygame/website/,而是将文件通过此处定义的存储后端发送到 S3。

注意:没有办法(或需要)直接访问或使用此处的功能与其他贡献或自定义代码。只需按照正常方式工作,Django 会处理其余部分。

安装

设置 AWS 帐户

如果你没有 AWS S3 帐户,请在 https://aws.amazon.com/ 创建一个 - AWS S3 的文档可在这里获得: https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html

应用程序所需的凭据是 AWS IAM 访问密钥和秘密密钥,可以在 AWS 控制台中生成/找到。

以下示例 IAM 控制策略权限可以添加到 AWS 中的 IAM 服务。有关此内容的文档可以在此处找到: https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html

请注意,只有在你想严格控制此插件访问的角色时,才需要此步骤。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "evennia",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::YOUR_BUCKET_NAME/*",
                "arn:aws:s3:::YOUR_BUCKET_NAME"
            ]
        },
        {
            "Sid": "evennia",
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        }
    ]
}

高级用户: 第二个 IAM 语句 CreateBucket 仅在初始安装时需要。你可以稍后将其删除,或者你可以自己创建存储桶并设置 ACL 后继续。

依赖关系

此包需要依赖项 “boto3 >= 1.4.4”,这是官方的 AWS Python 包。安装时,最好直接安装 Evennia 的额外要求:

pip install evennia[extra]

如果你通过 git 安装 Evennia,你也可以:

  • cd 到 Evennia 存储库的根目录。

  • pip install --upgrade -e .[extra]

配置 Evennia

secret_settings.py 中自定义以下变量的值。无需进一步配置。请注意需要设置为实际值的三行。

# START OF SECRET_SETTINGS.PY COPY/PASTE >>>

AWS_ACCESS_KEY_ID = 'THIS_IS_PROVIDED_BY_AMAZON'
AWS_SECRET_ACCESS_KEY = 'THIS_IS_PROVIDED_BY_AMAZON'
AWS_STORAGE_BUCKET_NAME = 'mygame-evennia' # CHANGE ME! 我建议使用你的游戏名称-evennia

# 下面的设置也需要放在 secret_settings.py 中,但除非你想做特别花哨的事情,否则不需要定制。

AWS_S3_REGION_NAME = 'us-east-1' # 新泽西州
AWS_S3_OBJECT_PARAMETERS = { 'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
                            'CacheControl': 'max-age=94608000', }
AWS_DEFAULT_ACL = 'public-read'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_AUTO_CREATE_BUCKET = True
STATICFILES_STORAGE = 'evennia.contrib.base_systems.awsstorage.aws-s3-cdn.S3Boto3Storage'

# <<< END OF SECRET_SETTINGS.PY COPY/PASTE

你也可以将这些密钥存储为相同名称的环境变量。有关高级配置,请参考 django-storages 的文档。

在复制上述内容后,运行 evennia reboot

检查功能

通过访问你的网站,检查任何图像(例如,徽标)的源代码,确认 Web 资产正在从 S3 提供。它应该显示为 https://your-bucket-name.s3.amazonaws.com/path/to/file。如果是这样,系统工作正常,你就不需要做其他任何事情。

卸载

如果你没有更改静态文件(上传的图像等),则可以简单地删除你添加到 secret_settings.py 的行。如果你做了更改并希望稍后卸载,可以从 S3 存储桶导出文件并将它们放入 Evennia 目录中的 /static/ 下。

许可证

此代码严重依赖于 django-storages 提供的代码,贡献者包括:

  • Marty Alchin (S3)

  • David Larlet (S3)

  • Arne Brodowski (S3)

  • Sebastian Serrano (S3)

  • Andrew McClain (MogileFS)

  • Rafal Jonca (FTP)

  • Chris McCormick (S3 with Boto)

  • Ivanov E. (Database)

  • Ariel Núñez (packaging)

  • Wim Leers (SymlinkOrCopy + patches)

  • Michael Elsdörfer (Overwrite + PEP8 compatibility)

  • Christian Klein (CouchDB)

  • Rich Leland (Mosso Cloud Files)

  • Jason Christa (patches)

  • Adam Nelson (patches)

  • Erik CW (S3 encryption)

  • Axel Gembe (Hash path)

  • Waldemar Kornewald (MongoDB)

  • Russell Keith-Magee (Apache LibCloud patches)

  • Jannis Leidel (S3 and GS with Boto)

  • Andrei Coman (Azure)

  • Chris Streeter (S3 with Boto)

  • Josh Schneier (Fork maintainer, Bugfixes, Py3K)

  • Anthony Monthe (Dropbox)

  • EunPyo (Andrew) Hong (Azure)

  • Michael Barrientos (S3 with Boto3)

  • piglei (patches)

  • Matt Braymer-Hayes (S3 with Boto3)

  • Eirik Martiniussen Sylliaas (Google Cloud Storage native support)

  • Jody McIntyre (Google Cloud Storage native support)

  • Stanislav Kaledin (Bug fixes in SFTPStorage)

  • Filip Vavera (Google Cloud MIME types support)

  • Max Malysh (Dropbox large file support)

  • Scott White (Google Cloud updates)

  • Alex Watt (Google Cloud Storage patch)

  • Jumpei Yoshimura (S3 docs)

  • Jon Dufresne

  • Rodrigo Gadea (Dropbox fixes)

  • Martey Dodoo

  • Chris Rink

  • Shaung Cheng (S3 docs)

  • Andrew Perry (Bug fixes in SFTPStorage)

从 django-storages 重用的代码根据 BSD 3-Clause 许可证发布,许可证与 Evennia 相同,因此有关详细许可,请参考 Evennia 许可证。

版本

确认此插件支持 Django 2 和 Django 3。


此文档页面并非由 evennia/contrib/base_systems/awsstorage/README.md自动生成。如想阅读最新文档,请参阅原始README.md文件。