Setting Front CDN
Cloudfront
- 원본 편집 - 원본 액세스 - 원본 액세스 제어 설정 - Origin access control
S3 버킷 생성
- Restrict access to an Amazon S3 origin
- Amazon S3 Object Ownership to Bucket owner enforced
- pubilc access 퍼블릭 액세스 차단
- not a bucket configured as a website endpoint. 정적 웹 사이트 호스팅 쓰지 않기
권한 탭
버킷 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::YOUR_BUCKET"],
"Principal": {
"AWS": "arn:aws:iam::YOUR_ACCOUNT_NUMBER:user/YOUR_USERNAME"
},
"Effect": "Allow"
},
{
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:DeleteObject", // sync --delete에 필요. https://stackoverflow.com/a/30638955/5163033
"s3:GetObject",
"s3:GetObjectAcl",
"s3:AbortMultipartUpload"
],
"Resource": ["arn:aws:s3:::YOUR_BUCKET/*"],
"Principal": {
"AWS": "arn:aws:iam::YOUR_ACCOUNT_NUMBER:user/YOUR_USERNAME"
},
"Effect": "Allow"
},
{
// Cloudfront OAC, https://aws.amazon.com/blogs/networking-and-content-delivery/amazon-cloudfront-introduces-origin-access-control-oac/
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::YOUR-ACCOUNT-ID:distribution/YOUR-DISTRIBUTION-ID"
}
}
},
{
//Public read가 필요하다면
"Sid": "public-read",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR_BUCKET/*"
}
]
}
CloudFront 배포 생성
- origin domain: S3
- SSL Certicicate → Custom SSL → ACM에 만들어져 있는 SSL
- CNAME: domain name
- default root object: index.html
Route53
CNAME 생성
- 레코드 이름: site name
- 값: CloudFront의 URL
Cache
CloudFront Functions
// cache
// path pattern - Default (*)
function handler(event) {
var response = event.response
var headers = response.headers
// CORS header
if (!headers["access-control-allow-origin"]) {
headers["access-control-allow-origin"] = { value: "*" }
console.log("Access-Control-Allow-Origin was missing, adding it now.")
}
// cache-control
headers["cache-control"] = { value: "public,max-age=31536000,immutable;" }
return response
}
// non-cache index.html cache가 남아 있으면 front 배포 때마다 새로 build 된 assets의 uri을 못 가져온다.
// path pattern - *.html
function handler(event) {
var response = event.response
var headers = response.headers
// CORS header
if (!headers["access-control-allow-origin"]) {
headers["access-control-allow-origin"] = { value: "*" }
}
// cache-control
headers["cache-control"] = { value: "no-store, must-revalidate" }
return response
}
함수연결 - 뷰어 응답
SPA framework - S3 - CloudFront 배포 시 404 error 처리
없는 URI로 접근 시 403 error가 뜬다. 아마도 해당 url path를 cloudFront에서 인식하지 못해서 S3로 요청이 가고 public이 아니니 permission denied 에러
cloudfront에서 403 error를 SPA framework index.html로 처리하도록 해주면 framework에서 404 처리해 줌
Github Actions with IAM Roles
Configuring OpenID Connect in Amazon Web Services
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::<arn-number>:role/<role-name>
role-duration-seconds: 900
aws-region: <region>
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::<arn-number>:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:<org-name>/<repo-name>:*"
}
}
}
]
}
Backlinks