AWS S3에 배포하면 CloudFront 캐시를 자동으로 비활성화(invalidation)하는 Node.js Lambda
13657 단어 람다CloudFrontS3AWS
개요
정적 콘텐츠를 AWS S3에 배치하고 CloudFront를 이전 단계로 설정한 상태에서 S3를 업데이트해도 CloudFront의 에지 서버 캐시는 자동으로 업데이트되지 않으며 캐시 만료 기간에는 반영되지 않습니다.
해당 캐시를 수동으로 비활성화하는 프로덕션 흐름을 자동화하는 절차 노트
롤을 만드는 곳에서 node.js의 Lambda에서 할 구성에서 기사가 없었던 것 같아서 남겨 둡니다.
구성
처음에는 배포 스크립트에서 CloudFront API을 직접 두드려 실현할까 생각했습니다
그러나 Lambda가 S3의 추가 삭제 이벤트를 트리거 할 수 있기 때문에, 타이밍으로서 그쪽이 적절하고, 게다가 AWS SDK
스크립트는 프런트 엔드 엔지니어가 쉽게 관리 할 수 있도록 Node.js javascript로 만들었습니다.
절차
IAM 역할 만들기
Lambda가 CloudFront의 CreateInvalidation을 두드릴 수 있도록 적절한 이름으로 IAM 역할을 만듭니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "cloudfront:CreateInvalidation",
"Resource": "*"
}
]
}
Lambda 롤에 적용
위에서 만든 롤 적용
Lambda 트리거 추가
반응시키고 싶은 S3 Bucket 마다, すべてのオブジェクト作成イベント
와 オブジェクトの削除(すべて)
의 2 개의 트리거를 만든다
Lambda 코드 작성
인라인 편집, Node.js 선택
const AWS = require("aws-sdk");
const cloudfront = new AWS.CloudFront({ apiVersion: "2019-03-26" });
// @see https://kotororo.net/2018/07/%E9%9D%99%E7%9A%84%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E5%8D%B3%E6%99%82%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%ABcloudfront%E3%81%AEinvalidation%E3%82%92%E8%B5%B0%E3%82%89%E3%81%9B%E3%82%8Blambda%E9%96%A2%E6%95%B0/
exports.handler = async event => {
const paths = getPathsFromEvent(event);
const s3BucketToCloudFrontDistributionId = {
"S3のバケット名": "CloudFront Distribution ID",
};
const distributionId = s3BucketToCloudFrontDistributionId[getS3BucketFromEvent(event)];
const params = {
DistributionId: distributionId,
InvalidationBatch: {
CallerReference: new Date().getTime().toString(),
Paths: paths
}
};
// @see https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudFront.html#createInvalidation-property
await cloudfront
.createInvalidation(params, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
console.log(data);
}
})
.promise();
console.log("invalidate: " + paths.Items[0]);
};
function getPathsFromEvent(event) {
console.log(JSON.stringify(event));
return {
Quantity: 1,
Items: ["/" + event.Records[0].s3.object.key]
};
}
function getS3BucketFromEvent(event) {
return event.Records[0].s3.bucket.name;
}
※ 복수의 개발 환경에 반응시키기 위해, s3BucketToCloudFrontDistributionId
라고 하는 매핑으로 하고 있으므로, 자신의 환경의 내용을 넣는다
동작 확인
S3에 추가 삭제하고 그 경로가 Invalidation되면 성공
얼마나 많은 시간에 무효화할 수 있습니까?
원래 *
에서 invalidation하고 있었지만, 이번 변경으로 S3의 이벤트가 각 오브젝트의 추가 삭제마다 발생해, invalidation도 1패스씩 요구되게 되었다
만약 대량의 이벤트가 발생했을 때에 문제없이 움직이는지 궁금해, 몇 번까지 한 번에 invaidation 할 수 있는지 조사했다
FAQ 에 의하면 이하와 같으므로, 통상의 사용이면 문제 없을 것 같았다
Q. 무효 요청 수에는 제한이 있습니까?
개체를 개별적으로 비활성화하려면 진행 중인 배포마다 최대 3,000개의 개체까지 한 번에 무효화 요청을 만들 수 있습니다. 이는 최대 3,000개의 개체에 대한 하나의 무효화 요청, 하나의 개체에 대해 최대 3,000개의 요청 또는 3,000개의 개체를 초과하지 않는 다른 조합일 수 있습니다.
*
와일드카드를 사용하는 경우 최대 15개의 무효화 경로에 대한 요청을 한 번에 만들 수 있습니다. 또한 진행 중인 배포마다 최대 3,000개의 개별 개체를 동시에 만들 수 있습니다. 와일드카드 무효화 요청 제한은 개체의 개별 무효화 제한과는 무관합니다. 이 한계를 초과하면 이전 요청이 끝날 때까지 추가 무효 요청이 오류를 반환합니다.
어려움
처음에는 배포 스크립트에서 CloudFront API을 직접 두드려 실현할까 생각했습니다
그러나 Lambda가 S3의 추가 삭제 이벤트를 트리거 할 수 있기 때문에, 타이밍으로서 그쪽이 적절하고, 게다가 AWS SDK
스크립트는 프런트 엔드 엔지니어가 쉽게 관리 할 수 있도록 Node.js javascript로 만들었습니다.
절차
IAM 역할 만들기
Lambda가 CloudFront의 CreateInvalidation을 두드릴 수 있도록 적절한 이름으로 IAM 역할을 만듭니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "cloudfront:CreateInvalidation",
"Resource": "*"
}
]
}
Lambda 롤에 적용
위에서 만든 롤 적용
Lambda 트리거 추가
반응시키고 싶은 S3 Bucket 마다, すべてのオブジェクト作成イベント
와 オブジェクトの削除(すべて)
의 2 개의 트리거를 만든다
Lambda 코드 작성
인라인 편집, Node.js 선택
const AWS = require("aws-sdk");
const cloudfront = new AWS.CloudFront({ apiVersion: "2019-03-26" });
// @see https://kotororo.net/2018/07/%E9%9D%99%E7%9A%84%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E5%8D%B3%E6%99%82%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%ABcloudfront%E3%81%AEinvalidation%E3%82%92%E8%B5%B0%E3%82%89%E3%81%9B%E3%82%8Blambda%E9%96%A2%E6%95%B0/
exports.handler = async event => {
const paths = getPathsFromEvent(event);
const s3BucketToCloudFrontDistributionId = {
"S3のバケット名": "CloudFront Distribution ID",
};
const distributionId = s3BucketToCloudFrontDistributionId[getS3BucketFromEvent(event)];
const params = {
DistributionId: distributionId,
InvalidationBatch: {
CallerReference: new Date().getTime().toString(),
Paths: paths
}
};
// @see https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudFront.html#createInvalidation-property
await cloudfront
.createInvalidation(params, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
console.log(data);
}
})
.promise();
console.log("invalidate: " + paths.Items[0]);
};
function getPathsFromEvent(event) {
console.log(JSON.stringify(event));
return {
Quantity: 1,
Items: ["/" + event.Records[0].s3.object.key]
};
}
function getS3BucketFromEvent(event) {
return event.Records[0].s3.bucket.name;
}
※ 복수의 개발 환경에 반응시키기 위해, s3BucketToCloudFrontDistributionId
라고 하는 매핑으로 하고 있으므로, 자신의 환경의 내용을 넣는다
동작 확인
S3에 추가 삭제하고 그 경로가 Invalidation되면 성공
얼마나 많은 시간에 무효화할 수 있습니까?
원래 *
에서 invalidation하고 있었지만, 이번 변경으로 S3의 이벤트가 각 오브젝트의 추가 삭제마다 발생해, invalidation도 1패스씩 요구되게 되었다
만약 대량의 이벤트가 발생했을 때에 문제없이 움직이는지 궁금해, 몇 번까지 한 번에 invaidation 할 수 있는지 조사했다
FAQ 에 의하면 이하와 같으므로, 통상의 사용이면 문제 없을 것 같았다
Q. 무효 요청 수에는 제한이 있습니까?
개체를 개별적으로 비활성화하려면 진행 중인 배포마다 최대 3,000개의 개체까지 한 번에 무효화 요청을 만들 수 있습니다. 이는 최대 3,000개의 개체에 대한 하나의 무효화 요청, 하나의 개체에 대해 최대 3,000개의 요청 또는 3,000개의 개체를 초과하지 않는 다른 조합일 수 있습니다.
*
와일드카드를 사용하는 경우 최대 15개의 무효화 경로에 대한 요청을 한 번에 만들 수 있습니다. 또한 진행 중인 배포마다 최대 3,000개의 개별 개체를 동시에 만들 수 있습니다. 와일드카드 무효화 요청 제한은 개체의 개별 무효화 제한과는 무관합니다. 이 한계를 초과하면 이전 요청이 끝날 때까지 추가 무효 요청이 오류를 반환합니다.
어려움
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "cloudfront:CreateInvalidation",
"Resource": "*"
}
]
}
const AWS = require("aws-sdk");
const cloudfront = new AWS.CloudFront({ apiVersion: "2019-03-26" });
// @see https://kotororo.net/2018/07/%E9%9D%99%E7%9A%84%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E5%8D%B3%E6%99%82%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%ABcloudfront%E3%81%AEinvalidation%E3%82%92%E8%B5%B0%E3%82%89%E3%81%9B%E3%82%8Blambda%E9%96%A2%E6%95%B0/
exports.handler = async event => {
const paths = getPathsFromEvent(event);
const s3BucketToCloudFrontDistributionId = {
"S3のバケット名": "CloudFront Distribution ID",
};
const distributionId = s3BucketToCloudFrontDistributionId[getS3BucketFromEvent(event)];
const params = {
DistributionId: distributionId,
InvalidationBatch: {
CallerReference: new Date().getTime().toString(),
Paths: paths
}
};
// @see https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudFront.html#createInvalidation-property
await cloudfront
.createInvalidation(params, function(err, data) {
if (err) {
console.log(err, err.stack);
} else {
console.log(data);
}
})
.promise();
console.log("invalidate: " + paths.Items[0]);
};
function getPathsFromEvent(event) {
console.log(JSON.stringify(event));
return {
Quantity: 1,
Items: ["/" + event.Records[0].s3.object.key]
};
}
function getS3BucketFromEvent(event) {
return event.Records[0].s3.bucket.name;
}
원래
*
에서 invalidation하고 있었지만, 이번 변경으로 S3의 이벤트가 각 오브젝트의 추가 삭제마다 발생해, invalidation도 1패스씩 요구되게 되었다만약 대량의 이벤트가 발생했을 때에 문제없이 움직이는지 궁금해, 몇 번까지 한 번에 invaidation 할 수 있는지 조사했다
FAQ 에 의하면 이하와 같으므로, 통상의 사용이면 문제 없을 것 같았다
Q. 무효 요청 수에는 제한이 있습니까?
개체를 개별적으로 비활성화하려면 진행 중인 배포마다 최대 3,000개의 개체까지 한 번에 무효화 요청을 만들 수 있습니다. 이는 최대 3,000개의 개체에 대한 하나의 무효화 요청, 하나의 개체에 대해 최대 3,000개의 요청 또는 3,000개의 개체를 초과하지 않는 다른 조합일 수 있습니다.
*
와일드카드를 사용하는 경우 최대 15개의 무효화 경로에 대한 요청을 한 번에 만들 수 있습니다. 또한 진행 중인 배포마다 최대 3,000개의 개별 개체를 동시에 만들 수 있습니다. 와일드카드 무효화 요청 제한은 개체의 개별 무효화 제한과는 무관합니다. 이 한계를 초과하면 이전 요청이 끝날 때까지 추가 무효 요청이 오류를 반환합니다.어려움
"이벤트 구조는 서비스에 따라 다릅니다"라는 설명 밖에 발견되지 않았다
보류한 것
정적 콘텐츠 자체를 그렇게 자주 업데이트하지 않기 때문에 보류했습니다.
참고
Reference
이 문제에 관하여(AWS S3에 배포하면 CloudFront 캐시를 자동으로 비활성화(invalidation)하는 Node.js Lambda), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kondei/items/a6840cbd59cdaaabd38d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)