class HerdstWorker::Configuration::Metadata

Attributes

aws_credentials[RW]
config[RW]
config_suffix[RW]
secrets[RW]
secrets_suffix[RW]

Public Class Methods

new(env, name, config) click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 16
def initialize(env, name, config)
    self.config = config
    self.config_suffix = "-#{name}-service-config"
    self.secrets_suffix = "-#{name}-service-secrets"
    
    self.secrets = {}.with_indifferent_access
    self.secrets["ENV"] = env
    
    begin
        self.reload!
    rescue Exception => ex
        if self.is_prod?
            puts "Failed to load metadata: #{ex.message}"
        else
            raise ex
        end
    end
end

Public Instance Methods

[](key) click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 50
def [](key)
    self.secrets[key.to_s.upcase]
end
[]=(key, value) click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 55
def []=(key, value)
    self.secrets[key.to_s.upcase] = value
end
get_aws_credentials() click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 60
def get_aws_credentials
    self.get_aws_credentials! rescue nil
end
get_aws_credentials!() click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 65
def get_aws_credentials!
    credentials = self.is_prod? ? 
         make_request!(get_credentials_uri) :
         self.config.config_for(:aws)
    
    self.aws_credentials = Aws::Credentials.new(
        credentials["AccessKeyId"], 
        credentials["SecretAccessKey"], 
        credentials["Token"]
    )
    
    Aws.config.update(
        region: self.get_aws_region,
        credentials: self.aws_credentials
    )
    
    self.aws_credentials
end
get_aws_region() click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 85
def get_aws_region
    # "ap-southeast-2"
    
    self["AWS_REGION"] = (ENV["AWS_REGION"] || "us-east-1")
end
get_secrets() click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 45
def get_secrets
    self.secrets
end
reload!() click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 36
def reload!
    self.get_aws_credentials!
    self.set_task_info!
    self.get_config_and_secrets!
    
    self
end

Protected Instance Methods

get_config_and_secrets!() click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 130
def get_config_and_secrets!
    values = nil
    
    if self.is_prod?
        secrets_client = Aws::SecretsManager::Client.new(
            :region => self.secrets["AWS_REGION"],
            :credentials => self.aws_credentials
        )
        
        config = secrets_client.get_secret_value({
            :secret_id => (self.secrets["DEPLOYMENT_ENV"].to_s + self.config_suffix)
        })
        
        secrets = secrets_client.get_secret_value({
            :secret_id => (self.secrets["DEPLOYMENT_ENV"].to_s + self.secrets_suffix)
        })
        
        values = Hash.new
        values.merge!(JSON.parse(config[:secret_string]))
        values.merge!(JSON.parse(secrets[:secret_string]))
    else
        values = self.config.config_for(:metadata)
    end
    
    values.each { |k, v| self[k] = v } if values
end
is_prod?() click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 93
def is_prod?
    self.secrets["ENV"] == "production"
end
set_task_info!() click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 98
def set_task_info!
    return self.secrets["DEPLOYMENT_ENV"] if self.secrets["DEPLOYMENT_ENV"]
    
    if self.is_prod?
        metadata = make_request!(get_metadata_uri)
        
        ecs_client = Aws::ECS::Client.new(
            :region => self.secrets["AWS_REGION"],
            :credentials => self.aws_credentials
        )
        
        ecs_response = ecs_client.describe_tasks(
            :cluster => metadata["Cluster"],
            :tasks => [
                metadata["TaskARN"]
            ],
            :include => ["TAGS"]
        )
        
        ecs_response["tasks"][0]["tags"].each do |i|
            self[i["key"]] = i["value"]
        end
        
        report_error("Deployment env not found") unless self.secrets["DEPLOYMENT_ENV"]
        
        self["RELEASE_VERSION"] = ecs_response["tasks"][0]["containers"][0]["containerArn"] rescue nil
    else
        self["DEPLOYMENT_ENV"] = "development"
    end
end

Private Instance Methods

get_credentials_uri() click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 163
def get_credentials_uri
    "http://169.254.170.2" + ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"].to_s
end
get_metadata_uri() click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 159
def get_metadata_uri
    ENV["ECS_CONTAINER_METADATA_URI"].to_s + "/task"
end
make_request!(request_url) click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 167
def make_request!(request_url)
    uri = URI.parse(request_url)
    http = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == "https")
    request = Net::HTTP::Get.new(uri.to_s)
    response = http.request(request) rescue nil
    
    if response && response.code.to_i === 200
        return JSON.parse(response.body).with_indifferent_access
    else
        report_error("Failed to ger request: #{request_url}")
    end
end
report_error(message) click to toggle source
# File lib/herdst_worker/configuration/metadata.rb, line 180
def report_error(message)
    raise message
end