Рубрики
Без рубрики

CI / CD для инвалидов CDN с использованием функции AWS LAMBDA и Газопровод Gitlab

– Cloudfront может ускорить доставку вашего статического контента (например, изображения, стиль SH … Помечено Gitlab, Python, AWS, лямбда.

– CloudFront может ускорить доставку вашего статического контента (например, изображения, стиль листов, JavaScript и т. Д.) для зрителей по всему миру. Используя Cloudfront, вы можете воспользоваться преимуществами AWS Backbone Network и Servers CloudFront Edge Servers, чтобы дать вам зрителям быстрый, безопасный и надежный опыт, когда они посещают ваш сайт.

– Простой подход для хранения и предоставления статического контента – использовать ведро Amazon S3. Использование S3 вместе с CloudFront имеет ряд преимуществ, включая опцию для использования идентификатора доступа к происхождению (OAI), чтобы легко ограничить доступ к вашему содержанию S3.

– Когда разработчики хотят обновить статические файлы, им просто нужно подтолкнуть коммит об изменении, все остальное уходит для работы по трубопроводу GitLab

– Общий поток: Файлы синхронизации трубопроводов GitLab в S3 -> S3 Событие уведомлений S3 Триггеры Lambda Функция -> Функция лямбда Создайте запрос на недействию к Cloudfront

Что в этом документе

  • Создание трубопровода GitLab для изменений файла синхронизации в S3
  • Создание функции Lambda Associate с событием S3 с использованием CAWS Chalice
  • Заключение

🚀 Создать работу трубопровода GitLab для изменений файла синхронизации в S3

⚡ $ cat .gitlab-ci.yaml 
before_script:
  - echo "Deploy CDN"

deploy_cdn:
  stage: deploy
  timeout: 5m
  script:
    - aws s3 sync static/src s3://static-demo/src/
  only:
    refs:
      - master
    changes:
      - static/src/**/*
  tags:
    - gitlab-runner

🚀 Создать функцию Lambda Associate с событием S3 с использованием CAWS Chalice

1. Создать AWS Chalice New-Project CDN-недействительна

⚡ $ chalice new-project cdn-invalidation
⚡ $ tree
.
├── app.py
├── invalidation-cdn.json
├── __pycache__
│   └── app.cpython-38.pyc
├── README.md
└── requirements.txt

1 directory, 6 files

2. Определите, какую область создать функцию лямбда вместо по умолчанию в локальной конфигурации AWS

⚡ $ export AWS_DEFAULT_REGION=us-east-1

3. Создание обработчика функции лямбда, которые создают недействительные файлы объектов Вход

  • Обработчик слушает S3: ObjectCreated: поставить событие, так что любые изменения в S3://MyBucket/Static/SRC Запустит функцию лямбда с входом только измененных объектных файлов

https://github.com/vumdao/cicd-invalidation-cdn/blob/master/cdn-invalidation/app.py

from chalice import Chalice
import boto3
import time


app_name = 'cdn-invalidation'
app = Chalice(app_name=app_name)
app.debug = True


class InvalidateCDN:
    """ Invalidate CDN """
    def __init__(self):
        self.distribution_id = 'A1AA1AA11A11AA'
        self.client = boto3.client('cloudfront')

    def create_invalidation(self, file_change):
        try:
            res = self.client.create_invalidation(
                DistributionId=self.distribution_id,
                InvalidationBatch={
                    'Paths': {
                        'Quantity': 1,
                        'Items': ["/{}".format(file_change)]
                    },
                    'CallerReference': str(time.time()).replace(".", "")
                }
            )
            invalidation_id = res['Invalidation']['Id']
            return invalidation_id
        except Exception as err:
            print(f"Failed to create invalidation, error {err}")
            exit(1)

    def get_invalidation_status(self, inval_id):
        try:
            res = self.client.get_invalidation(
                DistributionId=self.distribution_id,
                Id=inval_id
            )
            return res['Invalidation']['Status']
        except Exception as err:
            print(f"Failed to get invalidation status ID {inval_id}, error {err}")
            exit(1)

    def run(self, key):
        print(f"Deploying CDN file: {key}")
        the_id = self.create_invalidation(key)
        count = 0
        while True:
            status = self.get_invalidation_status(the_id)
            if status == 'Completed':
                print(f"Completed, id: {the_id}")
                break
            elif count < 10:
                count += 1
                time.sleep(30)
            else:
                print("Timeout, please check CDN")
                break


@app.on_s3_event(bucket='mybucket',
                 prefix='static/src/',
                 events=['s3:ObjectCreated:Put'])
def handle_s3_event(event):
    cdn = InvalidateCDN()
    cdn.run(event.key)

4. Обновлять требования включить BOTO3 в функцию лямбда

⚡ $ cat requirements.txt
boto3

5. Chalice развертывает, чтобы создать функцию лямбда

⚡ $ chalice deploy

6. Результат

  • Уведомления о событиях S3
  • Лямбда Функция с слоем события S3

🚀 вывод

  • Создание CI/CD OF CDN Endailation будет повысить развертывание и четкое острие кэш определения местоположения ваших статических файлов, особенно только измененные
  • Объединение событий уведомлений S3 и функции Lambda обеспечит ваш поток лучше, чем выполнение в Gitlab Runner или AWS CLI CLI.
  • Спасибо за прочтение этого блога, надеюсь, вы узнали новое.

🌠 Блог · Github · Stackoverflow · LinkedIn · Группа · Страница · Twitter 🌠.

Оригинал: “https://dev.to/vumdao/ci-cd-for-cdn-invalidation-using-aws-lambda-function-and-gitlab-pipeline-3662”