Najprościej przez AWS CDK. Po prostu aplikacja odpowiedzialna za deploy tworzy wymagane zasoby w AWS i robi deploy. Na przykład tak:
import {Bucket, BucketAccessControl} from "@aws-cdk/aws-s3";
import {BucketDeployment, Source} from "@aws-cdk/aws-s3-deployment";
import * as path from "path";
// tworzy S3 bucket do hostowania stron statycznych https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html
const bucket = new Bucket(this, 'Bucket', {
...
})
// deploy na stworzony wcześniej S3 bucket
new BucketDeployment(this, 'BucketDeployment', {
destinationBucket: bucket,
sources: [Source.asset(path.resolve(__dirname, './dist'))]
})
Najlepiej zrobić tak, że bucket ze stroną jest prywatny, a stronę udostępniasz publicznie za pomocą AWS CloudFront
import {Distribution, OriginAccessIdentity} from "@aws-cdk/aws-cloudfront";
import {S3Origin} from "@aws-cdk/aws-cloudfront-origins";
const bucket = new Bucket(this, 'Bucket', {
accessControl: BucketAccessControl.PRIVATE,
})
const originAccessIdentity = new OriginAccessIdentity(this, 'OriginAccessIdentity');
bucket.grantRead(originAccessIdentity);
new Distribution(this, 'Distribution', {
defaultRootObject: 'index.html',
defaultBehavior: {
origin: new S3Origin(bucket, {originAccessIdentity}),
},
})