Ein einfaches Tool zum Bereitstellen statischer Websites auf Amazon S3 und CloudFront mit Gzip- und benutzerdefinierten Header-Unterstützung (z. B. „Cache-Control“). Es verwendet ETag-Hashes, um zu überprüfen, ob sich eine Datei geändert hat, was es optimal in Kombination mit statischen Site-Generatoren wie Hugo macht.
Vorgefertigte Binärdateien finden Sie hier.
s3deploy ist eine Go-Anwendung, daher können Sie die neueste Version auch installieren mit:
go install github.com/bep/s3deploy/v2@latest
So installieren Sie es unter MacOS mit Homebrew:
brew install bep/tap/s3deploy
Hinweis Der Brühhahn oben stoppt derzeit bei Version 2.8.1; Weitere Informationen finden Sie in dieser Ausgabe.
Beachten Sie, dass s3deploy
ein perfektes Tool für die Verwendung mit einem kontinuierlichen Integrationstool wie CircleCI ist. Hier finden Sie ein Tutorial, das s3deploy mit CircleCI verwendet.
Die Liste der Flags beim Ausführen s3deploy -h
:
-V print version and exit
-acl string
provide an ACL for uploaded objects. to make objects public, set to 'public-read'. all possible values are listed here: https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl (default "private")
-bucket string
destination bucket name on AWS
-config string
optional config file (default ".s3deploy.yml")
-distribution-id value
optional CDN distribution ID for cache invalidation, repeat flag for multiple distributions
-endpoint-url string
optional endpoint URL
-force
upload even if the etags match
-h help
-ignore value
regexp pattern for ignoring files, repeat flag for multiple patterns,
-key string
access key ID for AWS
-max-delete int
maximum number of files to delete per deploy (default 256)
-path string
optional bucket sub path
-public-access
DEPRECATED: please set -acl='public-read'
-quiet
enable silent mode
-region string
name of AWS region
-secret string
secret access key for AWS
-skip-local-dirs value
regexp pattern of files of directories to ignore when walking the local directory, repeat flag for multiple patterns, default "^\/?(?:\w+\/)*(\.\w+)"
-skip-local-files value
regexp pattern of files to ignore when walking the local directory, repeat flag for multiple patterns, default "^(.*/)?/?.DS_Store$"
-source string
path of files to upload (default ".")
-strip-index-html
strip index.html from all directories expect for the root entry
-try
trial run, no remote updates
-v enable verbose logging
-workers int
number of workers to upload files (default -1)
Die Flags können in einer der folgenden Reihenfolgen (in der Reihenfolge ihrer Priorität) gesetzt werden:
s3deploy -path public/
S3DEPLOY_
, z. B. S3DEPLOY_PATH="public/"
..s3deploy.yml
, z. B. path: "public/"
key
und secret
werden auch die Betriebssystemumgebungsvariablen AWS_ACCESS_KEY_ID
und AWS_SECRET_ACCESS_KEY
(und AWS_SESSION_TOKEN
) überprüft. Auf diese Weise müssen Sie keine besonderen Maßnahmen ergreifen, damit es mit AWS Vault und ähnlichen Tools funktioniert. Umgebungsvariablenausdrücke in .s3deploy.yml
im Formular ${VAR}
werden vor dem Parsen erweitert:
path : " ${MYVARS_PATH} "
max-delete : " ${MYVARS_MAX_DELETE@U} "
Beachten Sie die spezielle @U
-Syntax ( Unquoute ) für das int-Feld.
Die Optionen -skip-local-dirs
und -skip-local-files
werden mit einem relativen Pfad aus dem Quellverzeichnis mit Pfadtrennzeichen im Unix-Stil abgeglichen. Das Quellverzeichnis wird durch dargestellt .
, der Rest beginnt mit einem /
.
Die Option -strip-index-html
entfernt index.html aus allen Verzeichnissen außer dem Root-Eintrag. Dies entspricht der Option mit (fast) demselben Namen in Hugo Deploy. Dies vereinfacht die Cloud-Konfiguration, die für einige Anwendungsfälle erforderlich ist, z. B. CloudFront-Verteilungen mit S3-Bucket-Ursprüngen. Weitere Informationen finden Sie in dieser PR.
Die Konfigurationsdatei .s3deploy.yml
kann auch eine oder mehrere Routen enthalten. Eine Route gleicht Dateien mit einem regulären Ausdruck ab. Für jede Route können gelten:
header
: Header-Werte, der bemerkenswerteste ist wahrscheinlich Cache-Control
. Beachten Sie, dass die Liste der systemdefinierten Metadaten, die S3 derzeit unterstützt und als HTTP-Header zurückgibt, wenn eine statische Site gehostet wird, sehr kurz ist. Wenn Sie erweiterte Anforderungen haben (z. B. Sicherheitsheader), lesen Sie diesen Kommentar.
gzip
: Auf „true“ setzen, um den Inhalt beim Speichern in S3 zu gzipen. Dadurch wird auch die korrekte Content-Encoding
festgelegt, wenn das Objekt aus S3 abgerufen wird.
Beispiel:
routes :
- route : " ^.+ \ .(js|css|svg|ttf)$ "
# cache static assets for 1 year.
headers :
Cache-Control : " max-age=31536000, no-transform, public "
gzip : true
- route : " ^.+ \ .(png|jpg)$ "
headers :
Cache-Control : " max-age=31536000, no-transform, public "
gzip : false
- route : " ^.+ \ .(html|xml|json)$ "
gzip : true
Siehe https://docs.aws.amazon.com/sdk-for-go/api/aws/session/#hdr-Sessions_from_Shared_Config
Das AWS SDK
greift auf Anmeldeinformationen von ~/.aws/credentials
zurück.
Wenn Sie die Umgebungsvariable AWS_SDK_LOAD_CONFIG
festlegen, wird auch die gemeinsam genutzte Konfiguration aus ~/.aws/config
geladen, wo Sie die globale region
festlegen können, die verwendet werden soll, wenn sie nicht bereitgestellt wird usw.
{
"Version" : " 2012-10-17 " ,
"Statement" :[
{
"Effect" : " Allow " ,
"Action" :[
" s3:ListBucket " ,
" s3:GetBucketLocation "
],
"Resource" : " arn:aws:s3:::<bucketname> "
},
{
"Effect" : " Allow " ,
"Action" :[
" s3:PutObject " ,
" s3:PutObjectAcl " ,
" s3:DeleteObject "
],
"Resource" : " arn:aws:s3:::<bucketname>/* "
}
]
}
Ersetzen Sie es durch Ihr eigenes.
Wenn Sie CloudFront CDN vor Ihrem S3-Bucket konfiguriert haben, können Sie die distribution-id
als Flag angeben. Dadurch wird sichergestellt, dass der Cache für die aktualisierten Dateien nach der Bereitstellung auf S3 ungültig wird. Beachten Sie, dass der AWS-Benutzer über die erforderlichen Zugriffsrechte verfügen muss.
Beachten Sie, dass CloudFront 1.000 Pfade pro Monat kostenlos zulässt, daher versucht S3deploy, bei der Invalidierungsstrategie klug vorzugehen; Wir versuchen, die Anzahl der Pfade auf 8 zu reduzieren. Wenn das nicht möglich ist, greifen wir auf eine vollständige Invalidierung zurück, z. B. „/*“.
{
"Version" : " 2012-10-17 " ,
"Statement" : [
{
"Effect" : " Allow " ,
"Action" : [
" s3:ListBucket " ,
" s3:GetBucketLocation "
],
"Resource" : " arn:aws:s3:::<bucketname> "
},
{
"Effect" : " Allow " ,
"Action" : [
" s3:PutObject " ,
" s3:DeleteObject " ,
" s3:PutObjectAcl "
],
"Resource" : " arn:aws:s3:::<bucketname>/* "
},
{
"Effect" : " Allow " ,
"Action" : [
" cloudfront:GetDistribution " ,
" cloudfront:CreateInvalidation "
],
"Resource" : " * "
}
]
}
Wenn Sie sich s3deploy
ansehen, haben Sie wahrscheinlich bereits den Befehl aws s3 sync
gesehen. Dieser Befehl verfügt über eine Synchronisierungsstrategie, die nicht für statische Websites optimiert ist. Er vergleicht den Zeitstempel und die Größe Ihrer Dateien, um zu entscheiden, ob die Dateien hochgeladen werden sollen Datei.
Da Static-Site-Generatoren jede Datei neu erstellen können (auch wenn sie identisch ist), wird der Zeitstempel aktualisiert und daher lädt aws s3 sync
unnötigerweise jede einzelne Datei hoch. s3deploy
hingegen überprüft den Etag-Hash, um nach tatsächlichen Änderungen zu suchen, und verwendet diesen stattdessen.