class MU::Cloud::CloudFormation::Log

A log target as configured in {MU::Config::BasketofKittens::logs}

Attributes

cfm_name[R]
cfm_template[R]
cloud_id[R]
config[R]
mu_name[R]

Public Class Methods

cleanup(*args) click to toggle source

Placeholder. This is a NOOP for CloudFormation, which doesn't build resources directly.

# File modules/mu/providers/cloudformation/log.rb, line 147
def self.cleanup(*args)
  MU.log "cleanup() not implemented for CloudFormation layer", MU::DEBUG
  nil
end
find(*args) click to toggle source

Placeholder. This is a NOOP for CloudFormation, which doesn't build resources directly.

# File modules/mu/providers/cloudformation/log.rb, line 141
def self.find(*args)
  MU.log "find() not implemented for CloudFormation layer", MU::DEBUG
  nil
end
isGlobal?() click to toggle source

Does this resource type exist as a global (cloud-wide) artifact, or is it localized to a region/zone? @return [Boolean]

# File modules/mu/providers/cloudformation/log.rb, line 170
def self.isGlobal?
  MU::Cloud.resourceClass("AWS", "Log").isGlobal?
end
new(mommacat: nil, kitten_cfg: nil, mu_name: nil, cloud_id: nil) click to toggle source

@param mommacat [MU::MommaCat]: A {MU::Mommacat} object containing the deploy of which this resource is/will be a member. @param kitten_cfg [Hash]: The fully parsed and resolved {MU::Config} resource descriptor as defined in {MU::Config::BasketofKittens::logs}

# File modules/mu/providers/cloudformation/log.rb, line 31
def initialize(mommacat: nil, kitten_cfg: nil, mu_name: nil, cloud_id: nil)
  @deploy = mommacat
  @config = kitten_cfg
  @cloud_id ||= cloud_id
  if !mu_name.nil?
    @mu_name = mu_name
  elsif @config['scrub_mu_isms']
    @mu_name = @config['name']
  else
    @mu_name ||= @deploy.getResourceName(@config["name"])
  end
end
schema(config) click to toggle source

Cloud-specific configuration properties. @param config [MU::Config]: The calling MU::Config object @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource

# File modules/mu/providers/cloudformation/log.rb, line 155
def self.schema(config)
  MU::Cloud.resourceClass("AWS", "Log").schema(config)
end
validateConfig(server, configurator) click to toggle source

Cloud-specific pre-processing of {MU::Config::BasketofKittens::servers}, bare and unvalidated. @param server [Hash]: The resource to process and validate @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member @return [Boolean]: True if validation succeeded, False otherwise

# File modules/mu/providers/cloudformation/log.rb, line 163
def self.validateConfig(server, configurator)
  MU::Cloud.resourceClass("AWS", "Log").validateConfig(server, configurator)
end

Public Instance Methods

create() click to toggle source

Populate @cfm_template with a resource description for this log in CloudFormation language.

# File modules/mu/providers/cloudformation/log.rb, line 46
def create
  @cfm_name, @cfm_template = MU::Cloud::CloudFormation.cloudFormationBase("loggroup", self, scrub_mu_isms: @config['scrub_mu_isms'])
  MU::Cloud::CloudFormation.setCloudFormationProp(@cfm_template[@cfm_name], "RetentionInDays", @config["retention_period"])

  @config["log_stream_name"] =
    if @config["enable_cloudtrail_logging"]
      { "Fn::Join" => [
          "",
          [
            { "Ref" => "AWS::AccountId" },
            "_CloudTrail_",
            { "Ref" => "AWS::Region" }
          ]
        ]
      }
    else
      @mu_name
    end

  stream_name, stream_template = MU::Cloud::CloudFormation.cloudFormationBase("logstream", self, scrub_mu_isms: @config['scrub_mu_isms'])
  MU::Cloud::CloudFormation.setCloudFormationProp(stream_template[stream_name], "LogGroupName", { "Ref" => @cfm_name })
  MU::Cloud::CloudFormation.setCloudFormationProp(stream_template[stream_name], "LogStreamName", @config["log_stream_name"])
  MU::Cloud::CloudFormation.setCloudFormationProp(stream_template[stream_name], "DependsOn", @cfm_name)
  @cfm_template.merge!(stream_template)

  if @config["filters"] && !@config["filters"].empty?
    @config["filters"].each{ |filter|
      metric_name, metric_template = MU::Cloud::CloudFormation.cloudFormationBase("logmetricfilter", self, name: @mu_name+"filter"+filter["name"], scrub_mu_isms: @config['scrub_mu_isms'])
      MU::Cloud::CloudFormation.setCloudFormationProp(metric_template[metric_name], "FilterPattern", filter["search_pattern"])
      MU::Cloud::CloudFormation.setCloudFormationProp(metric_template[metric_name], "MetricTransformations", { "MetricName" => filter["metric_name"], "MetricNamespace" => filter["namespace"], "MetricValue" => filter["value"] } )
      MU::Cloud::CloudFormation.setCloudFormationProp(metric_template[metric_name], "LogGroupName", { "Ref" => @cfm_name })
      MU::Cloud::CloudFormation.setCloudFormationProp(metric_template[metric_name], "DependsOn", @cfm_name)
      @cfm_template.merge!(metric_template)
    }
  end


  if @config["enable_cloudtrail_logging"]
    role_name, role_template = MU::Cloud::CloudFormation.cloudFormationBase("iamrole", name: @mu_name, scrub_mu_isms: @config['scrub_mu_isms'])
    iam_policy = {
      "Version" => "2012-10-17",
      "Statement" => [
        {
          "Sid" => "AWSCloudTrail",
          "Effect" => "Allow",
          "Action" => [
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource" => { "Fn::Join" => [
              "",
              [
                "arn:#{MU::Cloud::AWS.isGovCloud?(@config["region"]) ? "aws-us-gov" : "aws"}:logs:",
                { "Ref" => "AWS::Region" },
                ":",
                { "Ref" => "AWS::AccountId" },
                ":log-group:#{@cfm_name}:log-stream:",
                @config["log_stream_name"]
              ]
            ]
          }
        }
      ]
    }
    MU::Cloud::CloudFormation.setCloudFormationProp(role_template[role_name], "Policies", { "PolicyName" => "#{@mu_name}-CloudTrail", "PolicyDocument" => iam_policy })
    iam_assume_role_policy = {
      "Version" => "2012-10-17",
      "Statement" => [
          {
              "Effect" => "Allow",
              "Principal" => {
                  "Service" => [
                      "cloudtrail.amazonaws.com",
                      "cloudtrail.preprod.amazonaws.com"
                  ]
              },
              "Action" => [
                  "sts:AssumeRole"
              ]
          }
      ]
    }
    MU::Cloud::CloudFormation.setCloudFormationProp(role_template[role_name], "AssumeRolePolicyDocument", iam_assume_role_policy)
    @cfm_template.merge!(role_template)
    MU.log "You must manually associate the Log Group #{@cfm_name} and IAM Role #{role_name} with your account's Cloud Trail after this CloudFormation stack has been built.", MU::WARN
  end
end
notify() click to toggle source

Return the metadata for this CacheCluster @return [Hash]

# File modules/mu/providers/cloudformation/log.rb, line 136
def notify
  {}
end