Bitbucket è un prodotto Atlassian e uno store di codice basato su Git con strumenti CI/CD ottimizzati per team di collaborazione che usano Jira. Quando modifichi il tuo codice e mantieni revisioni e storico in Bitbucket, hai anche bisogno di automazione per il deployment.

CI/CD sta per automazione e significa Continuous Integration e Continuous Delivery. In questo articolo, useremo CI e CD contemporaneamente.

Tralascio "Come usare Bitbucket?" e ti presenterò le Bitbucket Pipelines per il continuous deployment su AWS S3 che utilizza CloudFront per la distribuzione in tutto il mondo.

Quando crei un bucket S3 con hosting statico abilitato, devi fare sync dalla tua cartella locale al bucket S3. Normalmente, dovremmo eseguire il comando aws s3 sync LOCAL_FOLDER/ s3://STATIC_HOSTING_ENABLED_BUCKET_NAME --delete per sincronizzare al 100% la cartella locale con il Bucket S3.

Se utilizzi CloudFront per la distribuzione, vedrai il vecchio contenuto quando visiti il sito web. Il motivo è che CloudFront memorizza nella cache tutti i contenuti su tutte le edge location e serve il contenuto dalle edge location. Dobbiamo "invalidare la cache" per il nuovo contenuto e fare il re-caching sulle edge location.

Quale Policy IAM usare per S3 e CloudFront?

Per la massima sicurezza, amo mettere la massima restrizione e il minimo permesso per le Policy IAM. Puoi vedere le policy qui sotto:

Policy IAM per Bucket S3

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3BucketPolicy",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::NOME_BUCKET",
                "arn:aws:s3:::NOME_BUCKET/*"
            ],
            "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"
                    ]
                }
            }
        }
    ]
}

Eseguiremo i nostri deployment in Bitbucket Pipelines e questi sono gli IP in uscita di Bitbucket Pipelines. Puoi vedere il riferimento da https://support.atlassian.com/bitbucket-cloud/docs/what-are-the-bitbucket-cloud-ip-addresses-i-should-use-to-configure-my-corporate-firewall/

Policy IAM per l'Invalidazione della Cache CloudFront

Per eseguire il comando di invalidazione della cache CloudFront via Bitbucket Pipelines, puoi usare la Policy IAM qui sotto. Puoi allegare la policy allo stesso utente AWS autorizzato per le operazioni S3 Sync.

{
    "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

In precedenza, hai già creato un utente AWS per eseguire le Bitbucket Pipelines per le operazioni CI/CD. È il momento di inserire le variabili d'ambiente nel repository. AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY sono sufficienti.

File della Pipeline

Ora, in questo passaggio, possiamo creare un file bitbucket-pipelines.yml per eseguire S3 Sync e 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

Quando il branch main riceve un nuovo commit, la pipeline si attiverà e inizierà a eseguire immediatamente. Dopodiché, il percorso root del tuo Repository Bitbucket "/" verrà sincronizzato con il tuo Bucket S3 ed eseguirà immediatamente l'invalidazione della cache per applicare il nuovo sito a tutte le edge location.

Spero che questo articolo ti sia d'aiuto. Se vuoi chiedere qualcosa, lascia un commento. Ti risponderò il prima possibile.