Deploy μιας ιστοσελίδας σε S3 και CloudFront με Bitbucket Pipelines
Σε αυτό το άρθρο, θα μάθεις πώς να κάνεις deploy τη static ιστοσελίδα σου σε S3 Bucket και Cache Invalidation αυτόματα...

Το Bitbucket είναι ένα προϊόν της Atlassian, ένα Git-based code repository με CI/CD εργαλεία βελτιστοποιημένα για ομάδες που συνεργάζονται μέσω Jira. Όταν αλλάζεις τον κώδικά σου και διατηρείς εκδόσεις και ιστορικό στο Bitbucket, χρειάζεσαι και κάποιο automation για το deployment.
Το CI/CD σημαίνει Continuous Integration και Continuous Delivery. Σε αυτό το άρθρο, θα χρησιμοποιήσουμε CI και CD ταυτόχρονα.
Παραλείπω το "How to use Bitbucket?" και θα σου παρουσιάσω τα Bitbucket Pipelines για continuous deployment σε AWS S3, το οποίο χρησιμοποιεί CloudFront για διανομή σε όλο τον κόσμο.
Όταν δημιουργείς ένα S3 bucket με υποστήριξη static hosting, πρέπει να κάνεις sync από τον τοπικό σου φάκελο στο S3 bucket. Κανονικά, θα τρέχαμε την εντολή aws s3 sync LOCAL_FOLDER/ s3://STATIC_HOSTING_ENABLED_BUCKET_NAME --delete για πλήρη συγχρονισμό του τοπικού φακέλου με το S3 Bucket.
Αν χρησιμοποιείς CloudFront για διανομή, θα βλέπεις το παλιό περιεχόμενο όταν επισκέπτεσαι την ιστοσελίδα. Ο λόγος είναι ότι το CloudFront κάνει cache όλο το περιεχόμενο σε όλα τα edge locations και το σερβίρει από εκεί. Πρέπει να κάνουμε "invalidate cache" για το νέο περιεχόμενο και να γίνει re-cache στα edge locations.
Ποιο IAM Policy να χρησιμοποιήσω για S3 και CloudFront;
Για μέγιστη ασφάλεια, μου αρέσει να βάζω μέγιστο περιορισμό και ελάχιστη πρόσβαση στα IAM Policies. Μπορείς να δεις τα policies παρακάτω:
S3 Bucket IAM Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "S3BucketPolicy",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::BUCKET_NAME",
"arn:aws:s3:::BUCKET_NAME/*"
],
"Condition": {
"ForAnyValue:IpAddress": {
"aws:SourceIp": [
"34.199.54.113/32",
"34.232.25.90/32",
"34.232.119.183/32",
"34.236.25.177/32",
"35.171.175.212/32",
"52.54.90.98/32",
"52.202.195.162/32",
"52.203.14.55/32",
"52.204.96.37/32",
"34.218.156.209/32",
"34.218.168.212/32",
"52.41.219.63/32",
"35.155.178.254/32",
"35.160.177.10/32",
"34.216.18.129/32",
"3.216.235.48/32",
"34.231.96.243/32",
"44.199.3.254/32",
"174.129.205.191/32",
"44.199.127.226/32",
"44.199.45.64/32",
"3.221.151.112/32",
"52.205.184.192/32",
"52.72.137.240/32"
]
}
}
}
]
}Θα τρέχουμε τα deployments στα Bitbucket Pipelines και αυτές είναι οι outbound IP διευθύνσεις των Bitbucket Pipelines. Μπορείς να δεις την αναφορά στο https://support.atlassian.com/bitbucket-cloud/docs/what-are-the-bitbucket-cloud-ip-addresses-i-should-use-to-configure-my-corporate-firewall/
CloudFront Cache Invalidation IAM Policy
Για να τρέξεις την εντολή CloudFront cache invalidation μέσω Bitbucket Pipelines, μπορείς να χρησιμοποιήσεις το παρακάτω IAM Policy. Μπορείς να επισυνάψεις το policy στον ίδιο AWS user που έχει δικαίωμα για S3 Sync operations.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "CloudFrontCacheInvalidationPolicy",
"Effect": "Allow",
"Action": "cloudfront:CreateInvalidation",
"Resource": "arn:aws:cloudfront::ACCOUNT_ID:distribution/CF_DISTRIBUTION_ID",
"Condition": {
"ForAnyValue:IpAddress": {
"aws:SourceIp": [
"34.199.54.113/32",
"34.232.25.90/32",
"34.232.119.183/32",
"34.236.25.177/32",
"35.171.175.212/32",
"52.54.90.98/32",
"52.202.195.162/32",
"52.203.14.55/32",
"52.204.96.37/32",
"34.218.156.209/32",
"34.218.168.212/32",
"52.41.219.63/32",
"35.155.178.254/32",
"35.160.177.10/32",
"34.216.18.129/32",
"3.216.235.48/32",
"34.231.96.243/32",
"44.199.3.254/32",
"174.129.205.191/32",
"44.199.127.226/32",
"44.199.45.64/32",
"3.221.151.112/32",
"52.205.184.192/32",
"52.72.137.240/32"
]
}
}
}
]
}
Bitbucket Pipelines
Προηγουμένως, δημιούργησες ήδη έναν AWS user για να τρέχεις τα Bitbucket Pipelines για CI/CD λειτουργίες. Ήρθε η ώρα να βάλεις τα environment variables στο repository. Τα AWS_ACCESS_KEY_ID και AWS_SECRET_ACCESS_KEY είναι αρκετά.

Pipeline File
Τώρα, σε αυτό το βήμα, μπορούμε να δημιουργήσουμε ένα αρχείο bitbucket-pipelines.yml για να τρέξουμε το S3 Sync και το CloudFront Cache Invalidation.
pipelines:
branches:
main:
- step:
name: Deploy to S3 Bucket
deployment: Production
script:
- pipe: atlassian/aws-s3-deploy:1.1.0
variables:
AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY
AWS_DEFAULT_REGION: AWS-REGION
S3_BUCKET: 'S3_BUCKET_NAME'
DELETE_FLAG: 'true'
LOCAL_PATH: './'
- pipe: atlassian/aws-cloudfront-invalidate:0.1.1
variables:
AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY
AWS_DEFAULT_REGION: AWS-REGION
DISTRIBUTION_ID: CLOUDFRONT-DIST-IDΌταν το main branch έχει ένα νέο commit, το pipeline θα ενεργοποιηθεί και θα ξεκινήσει να τρέχει αμέσως. Μετά από αυτό, το root path "/" του Bitbucket Repository σου θα συγχρονιστεί με το S3 Bucket και θα τρέξει το Cache invalidation αμέσως για να εφαρμόσει τη νέα ιστοσελίδα σε όλα τα edge locations.
Ελπίζω αυτό το άρθρο να σε βοήθησε. Αν θέλεις να ρωτήσεις κάτι, άφησε ένα σχόλιο. Θα σου απαντήσω το συντομότερο δυνατό.
Περισσότερα από τον Ercan
Δύο ακόμη ιστότοποι, ίδιος συγγραφέας, διαφορετικό έδαφος.
AI, LLMs, agents, εφαρμοσμένη ML.
Σημειώσεις πεδίου για AI workloads. Ανάλυση κόστους Bedrock, agent patterns, trade-offs αποθήκευσης διανυσμάτων, failure modes σε παραγωγή.
Επισκεφθείτε ercan.ai →Ο κόμβος. Σχετικά, συμβουλευτική, επικοινωνία.
Προσωπικός κόμβος και για τις δύο διαδρομές γραφής. Ποιος είμαι, πώς λειτουργεί η συμβουλευτική, πώς να επικοινωνήσετε.
Επισκεφθείτε ercanermis.com →