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@latestSo installieren Sie es unter MacOS mit Homebrew:
brew install bep/tap/s3deployHinweis 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.