Working with Hitachi HCP
HCP is an affordable on-premise alternative to Amazon S3. At Indiana we're looking at using it for our deployment, specifically to avoid being tied to a shared file system.
Configuration
If you're using Avalon 7+, these settings need to point to HCP:
config/settings.yml
minio: endpoint: http://hcp.internal.example.edu public_host: http://hcp.external.example.edu # if different from endpoint access: <access key> secret: <secret key>
Problem
aws-sdk Ruby implementation appends an Accept-Encoding="" header to every request, which HCP doesn't accept. We need to change this header to Accept-Encoding="identity" for all but the presigned URLs. The following code requires aws-sdk v3 to work.
config/initializer/aws.rb
# Add header for HCP compatibility module Seahorse module Client module Plugins class AcceptEncoding < Plugin # @api private class Handler < Client::Handler def call(context) context.http_request.headers['Accept-Encoding'] = 'identity' @handler.call(context) end end handler(Handler, step: :sign, priority: 0) end end end end Aws::S3::Client.add_plugin Seahorse::Client::Plugins::AcceptEncoding # Exclude this header from the signature calculation otherwise S3 will not accept the presigned_url Aws::S3::Presigner::BLACKLISTED_HEADERS = Aws::S3::Presigner::BLACKLISTED_HEADERS + ["accept-encoding"]