class OpenStax::Aws::Distribution

Attributes

id[R]
logger[R]
region[R]

Public Class Methods

new(id:, region:, logger: nil) click to toggle source
# File lib/openstax/aws/distribution.rb, line 6
def initialize(id:, region:, logger: nil)
  @id = id
  @region = region
  @logger ||= Logger.new(IO::NULL)
end

Public Instance Methods

invalidate(paths:, wait: false) click to toggle source
# File lib/openstax/aws/distribution.rb, line 12
def invalidate(paths:, wait: false)
  paths = [paths].flatten.compact

  resp = client.create_invalidation({
    distribution_id: id,
    invalidation_batch: {
      paths: {
        quantity: paths.length,
        items: paths,
      },
      caller_reference: "#{paths.join(' ')} #{Time.now.utc.strftime("%Y%m%d-%H%M%S")}"
    },
  })

  invalidation_id = resp.invalidation.id

  logger.info("Created invalidation #{invalidation_id} for paths #{paths.join(', ')}.")

  wait_message = OpenStax::Aws::WaitMessage.new(
    message: "Waiting for invalidation #{invalidation_id} to be completed"
  )

  begin
    Aws::CloudFront::Waiters::InvalidationCompleted.new(
      client: client,
      before_attempt: ->(*) { wait_message.say_it }
    ).wait(
      distribution_id: id,
      id: invalidation_id
    )
  rescue Aws::Waiters::Errors::WaiterFailed => error
    logger.error "Waiting failed: #{error.message}"
    raise
  end
  logger.info "Invalidation #{invalidation_id} has been completed!"
end

Protected Instance Methods

client() click to toggle source
# File lib/openstax/aws/distribution.rb, line 51
def client
  @cloudfront_client ||= ::Aws::CloudFront::Client.new(region: region)
end