Gzip 및 사용자 정의 헤더 지원(예: "Cache-Control")을 사용하여 Amazon S3 및 CloudFront에 정적 웹 사이트를 배포하는 간단한 도구입니다. ETag 해시를 사용하여 파일이 변경되었는지 확인하므로 Hugo와 같은 정적 사이트 생성기와 함께 사용하는 것이 가장 좋습니다.
사전 빌드된 바이너리는 여기에서 찾을 수 있습니다.
s3deploy 는 Go 애플리케이션이므로 다음을 사용하여 최신 버전을 설치할 수도 있습니다.
go install github.com/bep/s3deploy/v2@latest
Homebrew를 사용하여 MacOS에 설치하려면:
brew install bep/tap/s3deploy
참고 위의 추출 탭은 현재 v2.8.1에서 중지됩니다. 자세한 내용은 이 문제를 참조하세요.
s3deploy
는 CircleCI와 같은 지속적인 통합 도구와 함께 사용하기에 완벽한 도구입니다. CircleCI와 함께 s3deploy를 사용하는 튜토리얼은 여기를 참조하세요.
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)
플래그는 다음 중 하나로 설정될 수 있습니다(우선순위에 따라):
s3deploy -path public/
S3DEPLOY_
접두사가 붙은 OS 환경 변수(예: S3DEPLOY_PATH="public/"
).s3deploy.yml
의 키/값(예: path: "public/"
key
및 secret
확인의 경우 OS 환경 변수 AWS_ACCESS_KEY_ID
및 AWS_SECRET_ACCESS_KEY
(및 AWS_SESSION_TOKEN
)도 확인됩니다. 이렇게 하면 AWS Vault 및 유사한 도구에서 작동하도록 하기 위해 특별한 작업을 수행할 필요가 없습니다. ${VAR}
형식의 .s3deploy.yml
에 있는 환경 변수 표현식은 구문 분석되기 전에 확장됩니다.
path : " ${MYVARS_PATH} "
max-delete : " ${MYVARS_MAX_DELETE@U} "
int 필드에 대한 특수 @U
( Unquote ) 구문에 유의하세요.
-skip-local-dirs
및 -skip-local-files
옵션은 Unix 스타일 경로 구분 기호를 사용하여 소스 디렉터리의 상대 경로와 일치합니다. 소스 디렉터리는 로 표시됩니다 .
, 나머지는 /
로 시작합니다.
-strip-index-html
옵션은 루트 항목이 예상되는 모든 디렉터리에서 index.html을 제거합니다. 이는 Hugo 배포에서 (거의) 동일한 이름을 가진 옵션과 일치합니다. 이는 S3 버킷 오리진을 사용하는 CloudFront 배포와 같은 일부 사용 사례에 필요한 클라우드 구성을 단순화합니다. 자세한 내용은 이 PR을 참조하세요.
.s3deploy.yml
구성 파일에는 하나 이상의 경로가 포함될 수도 있습니다. 경로는 정규 표현식이 지정된 파일과 일치합니다. 각 경로가 적용될 수 있습니다:
header
: 헤더 값 중 가장 주목할만한 것은 아마도 Cache-Control
것입니다. S3가 현재 지원하고 정적 사이트를 호스팅할 때 HTTP 헤더로 반환하는 시스템 정의 메타데이터 목록은 매우 짧습니다. 고급 요구 사항(예: 보안 헤더)이 있는 경우 이 설명을 참조하세요.
gzip
: S3에 저장될 때 콘텐츠를 gzip으로 압축하려면 true로 설정합니다. 이는 또한 S3에서 객체를 가져올 때 올바른 Content-Encoding
설정합니다.
예:
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
https://docs.aws.amazon.com/sdk-for-go/api/aws/session/#hdr-Sessions_from_Shared_Config를 참조하세요.
AWS SDK
~/.aws/credentials
의 자격 증명으로 대체됩니다.
AWS_SDK_LOAD_CONFIG
환경 변수를 설정하면 ~/.aws/config
에서 공유 구성도 로드됩니다. 여기서 제공되지 않은 경우 사용할 전역 region
설정할 수 있습니다.
{
"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>/* "
}
]
}
자신의 것으로 교체하십시오.
S3 버킷 앞에 CloudFront CDN을 구성한 경우 distribution-id
플래그로 제공할 수 있습니다. 이렇게 하면 S3에 배포한 후 업데이트된 파일에 대한 캐시가 무효화됩니다. AWS 사용자에게는 필요한 액세스 권한이 있어야 합니다.
CloudFront는 매월 1,000개의 경로를 무료로 허용하므로 S3deploy는 무효화 전략에 대해 현명하게 노력하고 있습니다. 우리는 경로 수를 8로 줄이려고 노력합니다. 이것이 가능하지 않으면 "/*"와 같은 완전한 무효화로 되돌아갑니다.
{
"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" : " * "
}
]
}
s3deploy
를 보고 있다면 aws s3 sync
명령을 이미 본 적이 있을 것입니다. 이 명령에는 정적 사이트에 최적화되지 않은 동기화 전략이 있으므로 파일의 타임스탬프 와 크기를 비교하여 업로드 여부를 결정합니다. 파일.
정적 사이트 생성기는 모든 파일(동일하더라도)을 다시 생성할 수 있기 때문에 타임스탬프가 업데이트되므로 aws s3 sync
불필요하게 모든 단일 파일을 업로드합니다. 반면에 s3deploy
etag 해시를 확인하여 실제 변경 사항을 확인하고 대신 이를 사용합니다.