Skip to content
This repository has been archived by the owner on Sep 9, 2022. It is now read-only.

Adding support for cloudwatch log groups #511

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .ruby-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2.4.1
57 changes: 57 additions & 0 deletions HOWTO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Terraforming How-to Contribute

## Install `rvm`
```sh
gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
sudo gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
sudo apt-get install software-properties-common
sudo apt-add-repository -y ppa:rael-gc/rvm
sudo apt-get update
sudo apt-get install rvm
sudo usermod -a -G rvm yourusername
sudo reboot
```

## Install debug tools
```sh
gem install pry
gem install yaml
gem install rdoc
```

## Install ruby build tools and docs
```sh
brew upgrade # default gcc was v5 need > 7
sudo apt-get install rbenv # helpful in addition to rvm
sudo apt-get install ruby-dev # needed for gem installers
sudo rvm install 2.4.1 # might not be needed, I can't remember
rvm docs generate # install docs
rvm docs generate-ri # install ri compatible docs
```

## To create new modules for `terraforming`
```sh
brew unlink ruby # only needed if ruby was installed with homebrew
rbenv global 2.4.1 # install Ruby v2.4.1 for entire system
rvm use ruby-2.4.10 # use ruby v2.4.10
cd terraforming && script/setup # install everything needed to contribute to terraforming

# make your stuff
rake -t # shows what rake tasks there are
rake # runs default rake tasks
rake spec # runs RSpec tests
rake build # builds new version
rake install # installs new version to system
```

## To debug your stuff
```sh
require "pry" # includes the pry debug library

# in your code where you want a breakpoint add:
binding.pry

# helpful commands
puts whatever.methods.to_yaml # like pprint in python (sort of)
help # will reference ri documentation
``
27 changes: 15 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,20 @@

Export existing AWS resources to [Terraform](https://terraform.io/) style (tf, tfstate)

- [Supported version](#supported-version)
- [Installation](#installation)
- [Prerequisites](#prerequisites)
- [Usage](#usage)
- [Export tf](#export-tf)
- [Export tfstate](#export-tfstate)
- [Example: Export all](#example-export-all)
- [Run as Docker container](#run-as-docker-container-)
- [Development](#development)
- [Contributing](#contributing)
- [Similar projects](#similar-projects)
- [License](#license)
- [Terraforming](#terraforming)
- [Supported version](#supported-version)
- [Installation](#installation)
- [Prerequisites](#prerequisites)
- [Usage](#usage)
- [Export tf](#export-tf)
- [Export tfstate](#export-tfstate)
- [Example: Export all](#example-export-all)
- [Caveats](#caveats)
- [Run as Docker container ![Docker Repository on Quay.io](https://quay.io/repository/dtan4/terraforming)](#run-as-docker-container-)
- [Development](#development)
- [Contributing](#contributing)
- [Similar projects](#similar-projects)
- [License](#license)

## Supported version

Expand Down Expand Up @@ -87,6 +89,7 @@ Commands:
terraforming alb # ALB
terraforming asg # AutoScaling Group
terraforming cwa # CloudWatch Alarm
terraforming cwlg # CloudWatch Log Group
terraforming dbpg # Database Parameter Group
terraforming dbsg # Database Security Group
terraforming dbsn # Database Subnet Group
Expand Down
2 changes: 2 additions & 0 deletions lib/terraforming.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
require "aws-sdk-autoscaling"
require "aws-sdk-cloudwatch"
require "aws-sdk-cloudwatchlogs"
require "aws-sdk-dynamodb"
require "aws-sdk-ec2"
require "aws-sdk-efs"
Expand Down Expand Up @@ -27,6 +28,7 @@
require "terraforming/resource/alb"
require "terraforming/resource/auto_scaling_group"
require "terraforming/resource/cloud_watch_alarm"
require "terraforming/resource/cloud_watch_log_group"
require "terraforming/resource/db_parameter_group"
require "terraforming/resource/db_security_group"
require "terraforming/resource/db_subnet_group"
Expand Down
5 changes: 5 additions & 0 deletions lib/terraforming/cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ def cwa
execute(Terraforming::Resource::CloudWatchAlarm, options)
end

desc "cwlg", "CloudWatch Log Group"
def cwlg
execute(Terraforming::Resource::CloudWatchLogGroup, options)
end

desc "dbpg", "Database Parameter Group"
def dbpg
execute(Terraforming::Resource::DBParameterGroup, options)
Expand Down
56 changes: 56 additions & 0 deletions lib/terraforming/resource/cloud_watch_log_group.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
module Terraforming
module Resource
class CloudWatchLogGroup
include Terraforming::Util

def self.tf(client: Aws::CloudWatchLogs::Client.new)
self.new(client).tf
end

def self.tfstate(client: Aws::CloudWatchLogs::Client.new)
self.new(client).tfstate
end

def initialize(client)
@client = client
end

def tf
apply_template(@client, "tf/cloud_watch_log_group")
end

def tfstate
log_groups.inject({}) do |resources, log_group|
attributes = {
"arn" => log_group["arn"].to_s,
"creation_time" => log_group["creation_time"].to_i,
"kms_key_id" => log_group["kms_key_id"].to_s,
"log_group_name" => log_group["log_group_name"].to_s,
"metric_filter_count" => log_group["metric_filter_count"].to_i,
"retention_in_days" => log_group["retention_in_days"].to_i,
"stored_bytes" => log_group["stored_bytes"].to_i
}

resources["aws_cloudwatch_log_group.#{module_name_of(log_group)}"] = {
"type" => "aws_cloudwatch_log_group",
"primary" => {
"id" => log_group.log_group_name,
"attributes" => attributes
}
}
end
end

private

def log_groups
@client.describe_log_groups.map(&:log_groups).flatten
end

def module_name_of(log_group)
normalize_module_name(log_group.log_group_name)
end

end
end
end
7 changes: 7 additions & 0 deletions lib/terraforming/template/tf/cloud_watch_log_group.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<% log_groups.each do |log_group| -%>
resource "aws_cloudwatch_log_group" "<%= normalize_module_name(log_group.log_group_name) %>" {
name = "<%= log_group.log_group_name %>"
retention_in_days = "<%= log_group.retention_in_days %>"
kms_key_id = "<%= log_group.kms_key_id %>"
}
<% end -%>
7 changes: 7 additions & 0 deletions spec/lib/terraforming/cli_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ module Terraforming
it_behaves_like "CLI examples"
end

describe "cwlg" do
let(:klass) { Terraforming::Resource::CloudWatchLogGroup }
let(:command) { :cwlg }

it_behaves_like "CLI examples"
end

describe "dbpg" do
let(:klass) { Terraforming::Resource::DBParameterGroup }
let(:command) { :dbpg }
Expand Down
63 changes: 63 additions & 0 deletions spec/lib/terraforming/resource/cloud_watch_log_group_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
require "spec_helper"

module Terraforming
module Resource
describe CloudWatchLogGroup do
let(:client) do
Aws::CloudWatchLogs::Client.new(stub_responses: true)
end

let(:log_groups) do
[
{
arn: "arn:aws:logs:region:account:log-group",
creation_time: 1596223046916,
kms_key_id: "fbe14984-fd9f-40d2-94ce-55d738d35daa",
log_group_name: "Dummy Log Group 1",
metric_filter_count: 0,
retention_in_days: 90,
stored_bytes: 227
}
]
end

before do
client.stub_responses(:describe_log_groups, log_groups: log_groups)
end

describe ".tf" do
it "should generate tf" do
expect(described_class.tf(client: client)).to eq <<-EOS
resource "aws_cloudwatch_log_group" "Dummy-Log-Group-1" {
name = "Dummy Log Group 1"
retention_in_days = "90"
kms_key_id = "fbe14984-fd9f-40d2-94ce-55d738d35daa"
}
EOS
end
end

describe ".tfstate" do
it "should generate tfstate" do
expect(described_class.tfstate(client: client)).to eq(
{
"primary" => {
"attributes" => {
"arn" => "arn:aws:logs:region:account:log-group",
"creation_time" => 1596223046916,
"kms_key_id" => "fbe14984-fd9f-40d2-94ce-55d738d35daa",
"log_group_name" => "Dummy Log Group 1",
"metric_filter_count" => 0,
"retention_in_days" => 90,
"stored_bytes" => 227
},
"id" => "Dummy Log Group 1"
},
"type" => "aws_cloudwatch_log_group"
}
)
end
end
end
end
end
1 change: 1 addition & 0 deletions terraforming.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Gem::Specification.new do |spec|

spec.add_dependency "aws-sdk-autoscaling", "~> 1"
spec.add_dependency "aws-sdk-cloudwatch", "~> 1"
spec.add_dependency "aws-sdk-cloudwatchlogs", "~> 1"
spec.add_dependency "aws-sdk-dynamodb", "~> 1.18"
spec.add_dependency "aws-sdk-ec2", "~> 1"
spec.add_dependency "aws-sdk-efs", "~> 1", ">= 1.13.0"
Expand Down