From a49118f7d8cadd0df387e6d8a569228e636e8600 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Tue, 12 Jul 2016 18:46:04 -0400 Subject: [PATCH 01/17] Added option to use AWS bundled ca cert Fixes #171 --- README.md | 6 ++++++ lib/terraforming/cli.rb | 2 ++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index 81696811..06de463d 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,12 @@ aws_secret_access_key = FugaFuga $ terraforming s3 --profile hoge ``` +You can force the AWS SDK to utilize the CA certificate that is bundled with the SDK for systems where the default OpenSSL certificate is not installed (e.g. Windows) by utilizing the `--aws-use-bundled-cert` option. + +```bash +PS C:\> terraforming ec2 --aws-use-bundled-cert +``` + ## Usage ```bash diff --git a/lib/terraforming/cli.rb b/lib/terraforming/cli.rb index 27dc60b2..fdad07bd 100644 --- a/lib/terraforming/cli.rb +++ b/lib/terraforming/cli.rb @@ -5,6 +5,7 @@ class CLI < Thor class_option :tfstate, type: :boolean, desc: "Generate tfstate" class_option :profile, type: :string, desc: "AWS credentials profile" class_option :region, type: :string, desc: "AWS region" + class_option :"aws-use-bundled-cert", type: :boolean , desc: "Use the bundled CA certificate from AWS SDK" desc "asg", "AutoScaling Group" def asg @@ -202,6 +203,7 @@ def vgw def execute(klass, options) Aws.config[:credentials] = Aws::SharedCredentials.new(profile_name: options[:profile]) if options[:profile] Aws.config[:region] = options[:region] if options[:region] + Aws.use_bundled_cert! if options[:"aws-use-bundled-cert"] result = options[:tfstate] ? tfstate(klass, options[:merge]) : tf(klass) if options[:tfstate] && options[:merge] && options[:overwrite] From f9e7d91d98739f11ce5fb706cf3aafb3c7e16f61 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Tue, 12 Jul 2016 19:03:35 -0400 Subject: [PATCH 02/17] correcting rubocop warnings --- lib/terraforming/cli.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/terraforming/cli.rb b/lib/terraforming/cli.rb index fdad07bd..7a4d2d39 100644 --- a/lib/terraforming/cli.rb +++ b/lib/terraforming/cli.rb @@ -5,7 +5,9 @@ class CLI < Thor class_option :tfstate, type: :boolean, desc: "Generate tfstate" class_option :profile, type: :string, desc: "AWS credentials profile" class_option :region, type: :string, desc: "AWS region" - class_option :"aws-use-bundled-cert", type: :boolean , desc: "Use the bundled CA certificate from AWS SDK" + class_option :"aws-use-bundled-cert", + type: :boolean, + desc: "Use the bundled CA certificate from AWS SDK" desc "asg", "AutoScaling Group" def asg From 8f5096bb1171a7c42311a7642018fa0b191ae486 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Wed, 13 Jul 2016 13:36:44 -0400 Subject: [PATCH 03/17] adding lambda function implementation --- lib/terraforming.rb | 1 + lib/terraforming/cli.rb | 5 ++ lib/terraforming/resource/lambda_function.rb | 83 +++++++++++++++++++ .../template/tf/lambda_function.erb | 6 ++ 4 files changed, 95 insertions(+) create mode 100644 lib/terraforming/resource/lambda_function.rb create mode 100644 lib/terraforming/template/tf/lambda_function.erb diff --git a/lib/terraforming.rb b/lib/terraforming.rb index 5b411ed5..c25c2912 100644 --- a/lib/terraforming.rb +++ b/lib/terraforming.rb @@ -37,6 +37,7 @@ require "terraforming/resource/iam_role_policy" require "terraforming/resource/iam_user" require "terraforming/resource/iam_user_policy" +require "terraforming/resource/lambda_function" require "terraforming/resource/launch_configuration" require "terraforming/resource/internet_gateway" require "terraforming/resource/nat_gateway" diff --git a/lib/terraforming/cli.rb b/lib/terraforming/cli.rb index 27dc60b2..b2e70ed8 100644 --- a/lib/terraforming/cli.rb +++ b/lib/terraforming/cli.rb @@ -101,6 +101,11 @@ def iamup execute(Terraforming::Resource::IAMUserPolicy, options) end + desc "lambdafunction", "Lambda Function" + def lambdafunction + execute(Terraforming::Resource::LambdaFunction, options) + end + desc "lc", "Launch Configuration" def lc execute(Terraforming::Resource::LaunchConfiguration, options) diff --git a/lib/terraforming/resource/lambda_function.rb b/lib/terraforming/resource/lambda_function.rb new file mode 100644 index 00000000..c53b6ba3 --- /dev/null +++ b/lib/terraforming/resource/lambda_function.rb @@ -0,0 +1,83 @@ +module Terraforming + module Resource + class LambdaFunction + include Terraforming::Util + + def self.tf(client: Aws::Lambda::Client.new) + self.new(client).tf + end + + def self.tfstate(client: Aws::Lambda::Client.new) + self.new(client).tfstate + end + + def initialize(client) + @client = client + end + + def tf + apply_template(@client, "tf/lambda_function") + end + + def tfstate + db_instances.inject({}) do |resources, instance| + attributes = { + "filename" => instance.endpoint.address, + } + resources["aws_db_instance.#{module_name_of(instance)}"] = { + "type" => "aws_db_instance", + "primary" => { + "id" => instance.db_instance_identifier, + "attributes" => attributes + } + } + + resources + end + end + + private + + def lambda_functions + @client.list_functions.functions + .inject({}) do |resources, lambda_function| + func_detail = @client.get_function( + { function_name: lambda_function.function_name }) + + sdownload_lambda_code( + resources[lambda_function.function_name].url, + filename) + + resources[lambda_function.function_name] = func_detail + + resources + end + end + + def download_lambda_code(url, filename) + uri = URI.parse(url) + + http_client = Net::HTTP.new(uri.host, uri.port) + http_client.use_ssl = true + http_client.ca_file = Aws.config[:ssl_ca_bundle] + http_client.verify_mode = OpenSSL::SSL::VERIFY_PEER + + http_client.start do |http| + response = http.get(uri) + + unless response.code == "200" + raise "Error downloading Lambda Code HTTP Res Code #{response.code}" + end + + open filename, 'wb' do |io| + io.write response.body + end + end + end + + def module_name_of(lambda_function) + normalize_module_name(lambda_function.function_name) + end + end + end +end diff --git a/lib/terraforming/template/tf/lambda_function.erb b/lib/terraforming/template/tf/lambda_function.erb new file mode 100644 index 00000000..d9a2c979 --- /dev/null +++ b/lib/terraforming/template/tf/lambda_function.erb @@ -0,0 +1,6 @@ +<% lambda_functions.each do |lambda_function| -%> +resource "aws_lambda_function" "<%= lambda_function.function_name %>" { + filename = "<%= lambda_function.function_name %>.zip" + function_name = "<%= lambda_function.function_name %>" +} +<% end -%> \ No newline at end of file From cd562080ad94ee7f773734acda693e9e43d9fd87 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Wed, 13 Jul 2016 15:56:21 -0400 Subject: [PATCH 04/17] Updated lambda functions and testing --- lib/terraforming.rb | 1 + lib/terraforming/resource/lambda_function.rb | 10 +++++++--- lib/terraforming/template/tf/lambda_function.erb | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/terraforming.rb b/lib/terraforming.rb index c25c2912..50a370b6 100644 --- a/lib/terraforming.rb +++ b/lib/terraforming.rb @@ -9,6 +9,7 @@ end require "aws-sdk-core" +Aws.use_bundled_cert! require "erb" require "json" require "thor" diff --git a/lib/terraforming/resource/lambda_function.rb b/lib/terraforming/resource/lambda_function.rb index c53b6ba3..1d0db432 100644 --- a/lib/terraforming/resource/lambda_function.rb +++ b/lib/terraforming/resource/lambda_function.rb @@ -16,9 +16,14 @@ def initialize(client) end def tf + puts lambda_functions apply_template(@client, "tf/lambda_function") end + def matttest + lambda_functions + end + def tfstate db_instances.inject({}) do |resources, instance| attributes = { @@ -44,9 +49,8 @@ def lambda_functions func_detail = @client.get_function( { function_name: lambda_function.function_name }) - sdownload_lambda_code( - resources[lambda_function.function_name].url, - filename) + download_lambda_code(func_detail.code.location, + "#{func_detail.configuration.function_name}.zip") resources[lambda_function.function_name] = func_detail diff --git a/lib/terraforming/template/tf/lambda_function.erb b/lib/terraforming/template/tf/lambda_function.erb index d9a2c979..c43b4f7b 100644 --- a/lib/terraforming/template/tf/lambda_function.erb +++ b/lib/terraforming/template/tf/lambda_function.erb @@ -1,6 +1,6 @@ <% lambda_functions.each do |lambda_function| -%> -resource "aws_lambda_function" "<%= lambda_function.function_name %>" { - filename = "<%= lambda_function.function_name %>.zip" - function_name = "<%= lambda_function.function_name %>" +resource "aws_lambda_function" "<%= lambda_function.configuration.function_name %>" { + filename = "<%= lambda_function.configuration.function_name %>.zip" + function_name = "<%= lambda_function.configuration.function_name %>" } <% end -%> \ No newline at end of file From 578a1b3cc88ab61b5aea1d4e40058cf4c467548e Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Thu, 14 Jul 2016 21:23:13 -0400 Subject: [PATCH 05/17] Basic Lambda Function update --- lib/terraforming/resource/lambda_function.rb | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/lib/terraforming/resource/lambda_function.rb b/lib/terraforming/resource/lambda_function.rb index 1d0db432..ad0419f4 100644 --- a/lib/terraforming/resource/lambda_function.rb +++ b/lib/terraforming/resource/lambda_function.rb @@ -16,14 +16,9 @@ def initialize(client) end def tf - puts lambda_functions apply_template(@client, "tf/lambda_function") end - def matttest - lambda_functions - end - def tfstate db_instances.inject({}) do |resources, instance| attributes = { @@ -45,14 +40,13 @@ def tfstate def lambda_functions @client.list_functions.functions - .inject({}) do |resources, lambda_function| + .inject([]) do |resources, lambda_function| func_detail = @client.get_function( - { function_name: lambda_function.function_name }) - + { function_name: lambda_function.function_name } + ) download_lambda_code(func_detail.code.location, "#{func_detail.configuration.function_name}.zip") - - resources[lambda_function.function_name] = func_detail + resources.push(func_detail) resources end From 772cd56d6b39ec51046c069cf6537dd7347d346c Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Thu, 14 Jul 2016 21:23:51 -0400 Subject: [PATCH 06/17] lambda function erb --- .../template/tf/lambda_function.erb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/terraforming/template/tf/lambda_function.erb b/lib/terraforming/template/tf/lambda_function.erb index c43b4f7b..1a5842a6 100644 --- a/lib/terraforming/template/tf/lambda_function.erb +++ b/lib/terraforming/template/tf/lambda_function.erb @@ -1,6 +1,19 @@ <% lambda_functions.each do |lambda_function| -%> resource "aws_lambda_function" "<%= lambda_function.configuration.function_name %>" { - filename = "<%= lambda_function.configuration.function_name %>.zip" - function_name = "<%= lambda_function.configuration.function_name %>" + filename = "<%= lambda_function.configuration.function_name %>.zip" + function_name = "<%= lambda_function.configuration.function_name %>" + role = "<%= lambda_function.configuration.role %>" + handler = "<%= lambda_function.configuration.handler %>" + description = "<%= lambda_function.configuration.description %>" + memory_size = "<%= lambda_function.configuration.memory_size %>" + runtime = "<%= lambda_function.configuration.runtime %>" + timeout = "<%= lambda_function.configuration.timeout %>" + source_code_hash = "<%= lambda_function.configuration.code_sha_256 %>" + <% unless lambda_function.configuration.vpc_config.nil? -%> + vpc_config { + subnet_ids = <%= lambda_function.configuration.vpc_config.subnet_ids %> + security_groups_ids = <%= lambda_function.configuration.vpc_config.security_group_ids %> + } + <% end -%> } <% end -%> \ No newline at end of file From 43f0ee12fd7f480cd2b5fd38f338690034de7e5c Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Fri, 15 Jul 2016 12:38:30 -0400 Subject: [PATCH 07/17] Fixed ERB formatting --- lib/terraforming/template/tf/lambda_function.erb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/terraforming/template/tf/lambda_function.erb b/lib/terraforming/template/tf/lambda_function.erb index 1a5842a6..da99b9b5 100644 --- a/lib/terraforming/template/tf/lambda_function.erb +++ b/lib/terraforming/template/tf/lambda_function.erb @@ -13,7 +13,6 @@ resource "aws_lambda_function" "<%= lambda_function.configuration.function_name vpc_config { subnet_ids = <%= lambda_function.configuration.vpc_config.subnet_ids %> security_groups_ids = <%= lambda_function.configuration.vpc_config.security_group_ids %> - } - <% end -%> + }<% end -%> } -<% end -%> \ No newline at end of file +<% end -%>s \ No newline at end of file From 786f19b459e91676ae0bf0f241966e05a5169b29 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Fri, 15 Jul 2016 12:50:56 -0400 Subject: [PATCH 08/17] lambda erb formatting and field name change --- lib/terraforming/template/tf/lambda_function.erb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/terraforming/template/tf/lambda_function.erb b/lib/terraforming/template/tf/lambda_function.erb index da99b9b5..03137245 100644 --- a/lib/terraforming/template/tf/lambda_function.erb +++ b/lib/terraforming/template/tf/lambda_function.erb @@ -9,10 +9,11 @@ resource "aws_lambda_function" "<%= lambda_function.configuration.function_name runtime = "<%= lambda_function.configuration.runtime %>" timeout = "<%= lambda_function.configuration.timeout %>" source_code_hash = "<%= lambda_function.configuration.code_sha_256 %>" - <% unless lambda_function.configuration.vpc_config.nil? -%> +<% unless lambda_function.configuration.vpc_config.nil? -%> vpc_config { subnet_ids = <%= lambda_function.configuration.vpc_config.subnet_ids %> - security_groups_ids = <%= lambda_function.configuration.vpc_config.security_group_ids %> - }<% end -%> + security_group_ids = <%= lambda_function.configuration.vpc_config.security_group_ids %> + } +<% end -%> } -<% end -%>s \ No newline at end of file +<% end -%> \ No newline at end of file From 4495a588585b3c11e0c45006e2dd9ea5cc108d8e Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Sun, 17 Jul 2016 00:08:58 -0400 Subject: [PATCH 09/17] finished lambda tfstate, bug fixes and refactoring --- lib/terraforming.rb | 1 + lib/terraforming/resource/lambda_function.rb | 73 ++++++++++++++----- .../template/tf/lambda_function.erb | 2 +- 3 files changed, 57 insertions(+), 19 deletions(-) diff --git a/lib/terraforming.rb b/lib/terraforming.rb index 50a370b6..103e9573 100644 --- a/lib/terraforming.rb +++ b/lib/terraforming.rb @@ -14,6 +14,7 @@ require "json" require "thor" require "zlib" +require "net/http" require "terraforming/util" require "terraforming/version" diff --git a/lib/terraforming/resource/lambda_function.rb b/lib/terraforming/resource/lambda_function.rb index ad0419f4..36815c3e 100644 --- a/lib/terraforming/resource/lambda_function.rb +++ b/lib/terraforming/resource/lambda_function.rb @@ -20,16 +20,47 @@ def tf end def tfstate - db_instances.inject({}) do |resources, instance| + lambda_functions.inject({}) do |resources, instance| attributes = { - "filename" => instance.endpoint.address, + "arn" => instance.configuration.function_arn, + "description" => instance.configuration.description, + "filename" => "#{instance.configuration.function_name}.zip", + "function_name" => instance.configuration.function_name, + "handler" => instance.configuration.handler, + "id" => instance.configuration.function_name, + "last_modified" => instance.configuration + .last_modified + .strftime("%FT%T%z"), + "memory_size" => instance.configuration.memory_size.to_s, + "role" => instance.configuration.role, + "runtime" => instance.configuration.runtime, + "source_code_hash" => instance.configuration.code_sha_256, + "timeout" => instance.configuration.timeout.to_s, } - resources["aws_db_instance.#{module_name_of(instance)}"] = { - "type" => "aws_db_instance", - "primary" => { - "id" => instance.db_instance_identifier, - "attributes" => attributes - } + unless instance.configuration.vpc_config.nil? + # lambda is only supported in one vpc, hardcoding + attributes["vpc_config.#"] = "1" + + attributes["vpc_config.0.security_group_ids.#"] = + instance.configuration.vpc_config.security_group_ids.count.to_s + instance.configuration.vpc_config.security_group_ids.each do |sg| + crc = Zlib.crc32(sg) + attributes["vpc_config.0.security_group_ids.#{crc}"] = sg + end + + attributes["vpc_config.0.subnet_ids.#"] = + instance.configuration.vpc_config.subnet_ids.count.to_s + instance.configuration.vpc_config.subnet_ids.each do |sn| + crc = Zlib.crc32(sn) + attributes["vpc_config.0.subnet_ids.#{crc}"] = sn + end + end + resources["aws_lambda_function.#{module_name_of(instance)}"] = { + "type" => "aws_lambda_function", + "primary" => { + "id" => instance.configuration.function_name, + "attributes" => attributes + } } resources @@ -38,16 +69,22 @@ def tfstate private - def lambda_functions - @client.list_functions.functions - .inject([]) do |resources, lambda_function| - func_detail = @client.get_function( - { function_name: lambda_function.function_name } - ) - download_lambda_code(func_detail.code.location, - "#{func_detail.configuration.function_name}.zip") - resources.push(func_detail) + def download_all_lambda_function_code(all_lambda_functions) + all_lambda_functions.each do |function| + download_lambda_code(function.code.location, + "#{function.configuration.function_name}.zip") + end + end + + def lambda_functions_with_code + functions = lambda_functions + download_all_lambda_function_code(functions) + functions + end + def lambda_functions + @client.list_functions.functions.inject([]) do |resources, lf| + resources.push(@client.get_function(function_name: lf.function_name)) resources end end @@ -74,7 +111,7 @@ def download_lambda_code(url, filename) end def module_name_of(lambda_function) - normalize_module_name(lambda_function.function_name) + normalize_module_name(lambda_function.configuration.function_name) end end end diff --git a/lib/terraforming/template/tf/lambda_function.erb b/lib/terraforming/template/tf/lambda_function.erb index 03137245..59d8e0d0 100644 --- a/lib/terraforming/template/tf/lambda_function.erb +++ b/lib/terraforming/template/tf/lambda_function.erb @@ -1,4 +1,4 @@ -<% lambda_functions.each do |lambda_function| -%> +<% lambda_functions_with_code.each do |lambda_function| -%> resource "aws_lambda_function" "<%= lambda_function.configuration.function_name %>" { filename = "<%= lambda_function.configuration.function_name %>.zip" function_name = "<%= lambda_function.configuration.function_name %>" From 82f405965fcd34cad3c96b238716be4d9e13b1e5 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Sun, 17 Jul 2016 00:12:04 -0400 Subject: [PATCH 10/17] removed bundled cert commands needed for testing --- lib/terraforming.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/terraforming.rb b/lib/terraforming.rb index 103e9573..d7f268da 100644 --- a/lib/terraforming.rb +++ b/lib/terraforming.rb @@ -9,7 +9,6 @@ end require "aws-sdk-core" -Aws.use_bundled_cert! require "erb" require "json" require "thor" From 14ab6612e00f27c37b193bbfb5d23d45817d7779 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Tue, 19 Jul 2016 13:37:06 -0400 Subject: [PATCH 11/17] Adding terraform tests; updated error message --- lib/terraforming/resource/lambda_function.rb | 3 +- .../resource/lambda_function_spec.rb | 57 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 spec/lib/terraforming/resource/lambda_function_spec.rb diff --git a/lib/terraforming/resource/lambda_function.rb b/lib/terraforming/resource/lambda_function.rb index 36815c3e..5260887e 100644 --- a/lib/terraforming/resource/lambda_function.rb +++ b/lib/terraforming/resource/lambda_function.rb @@ -93,6 +93,7 @@ def download_lambda_code(url, filename) uri = URI.parse(url) http_client = Net::HTTP.new(uri.host, uri.port) + http_client.use_ssl = true http_client.ca_file = Aws.config[:ssl_ca_bundle] http_client.verify_mode = OpenSSL::SSL::VERIFY_PEER @@ -101,7 +102,7 @@ def download_lambda_code(url, filename) response = http.get(uri) unless response.code == "200" - raise "Error downloading Lambda Code HTTP Res Code #{response.code}" + raise "Error downloading Lambda Code HTTP Res Code #{response.code} from #{url}" end open filename, 'wb' do |io| diff --git a/spec/lib/terraforming/resource/lambda_function_spec.rb b/spec/lib/terraforming/resource/lambda_function_spec.rb new file mode 100644 index 00000000..82e3f91b --- /dev/null +++ b/spec/lib/terraforming/resource/lambda_function_spec.rb @@ -0,0 +1,57 @@ +require "spec_helper" + +module Terraforming + module Resource + describe LambdaFunction do + let(:client) do + Aws::Lambda::Client.new(stub_responses: true) + end + + let(:lambdas) do + [ + { + function_name: "LambdaFunc1" + }, + { + function_name: "LambdaFunc2" + } + ] + end + + context "without vpc" do + before do + puts "================" + puts lambdas + puts "==================" + client.stub_responses(:list_functions, functions:lambdas) + + end + + describe ".tf" do + it "should generate tf" do + puts "runner" + allow_any_instance_of(Net::HTTP).to receive(:start).and_return(true) + allow(Net::HTTP).to receive(:get).and_return(Net::HTTPResponse) + allow(Net::HTTPResponse).to receive(:code).and_return("200") + allow(Net::HTTPResponse).to receive(:body).and_return('never used') + + expect(described_class.tf(client: client)).to eq <<-EOF +resource "aws_lambda_function" "LamdaFunc1" { + filename = "" + function_name = "LamdaFunc1" + role = "" + handler = "" + description = "" + memory_size = "" + runtime = "" + timeout = "" + source_code_hash = "" +} + EOF + + end + end + end + end + end +end From ccbefb4034c7649c0f260e19ff7b70b3005833bd Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Wed, 20 Jul 2016 23:58:34 -0400 Subject: [PATCH 12/17] Revert "Merge branch 'lambda-support' of https://github.com/mattgartman/terraforming into cert-bundle-fix" This reverts commit ffad1a61e0d0e49a51ff100c995fadcc85fafed3, reversing changes made to 51f4caeae1c7f7efd0053ebd8f536b51707f5546. --- lib/terraforming/resource/lambda_function.rb | 3 +- .../resource/lambda_function_spec.rb | 57 ------------------- 2 files changed, 1 insertion(+), 59 deletions(-) delete mode 100644 spec/lib/terraforming/resource/lambda_function_spec.rb diff --git a/lib/terraforming/resource/lambda_function.rb b/lib/terraforming/resource/lambda_function.rb index 5260887e..36815c3e 100644 --- a/lib/terraforming/resource/lambda_function.rb +++ b/lib/terraforming/resource/lambda_function.rb @@ -93,7 +93,6 @@ def download_lambda_code(url, filename) uri = URI.parse(url) http_client = Net::HTTP.new(uri.host, uri.port) - http_client.use_ssl = true http_client.ca_file = Aws.config[:ssl_ca_bundle] http_client.verify_mode = OpenSSL::SSL::VERIFY_PEER @@ -102,7 +101,7 @@ def download_lambda_code(url, filename) response = http.get(uri) unless response.code == "200" - raise "Error downloading Lambda Code HTTP Res Code #{response.code} from #{url}" + raise "Error downloading Lambda Code HTTP Res Code #{response.code}" end open filename, 'wb' do |io| diff --git a/spec/lib/terraforming/resource/lambda_function_spec.rb b/spec/lib/terraforming/resource/lambda_function_spec.rb deleted file mode 100644 index 82e3f91b..00000000 --- a/spec/lib/terraforming/resource/lambda_function_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -require "spec_helper" - -module Terraforming - module Resource - describe LambdaFunction do - let(:client) do - Aws::Lambda::Client.new(stub_responses: true) - end - - let(:lambdas) do - [ - { - function_name: "LambdaFunc1" - }, - { - function_name: "LambdaFunc2" - } - ] - end - - context "without vpc" do - before do - puts "================" - puts lambdas - puts "==================" - client.stub_responses(:list_functions, functions:lambdas) - - end - - describe ".tf" do - it "should generate tf" do - puts "runner" - allow_any_instance_of(Net::HTTP).to receive(:start).and_return(true) - allow(Net::HTTP).to receive(:get).and_return(Net::HTTPResponse) - allow(Net::HTTPResponse).to receive(:code).and_return("200") - allow(Net::HTTPResponse).to receive(:body).and_return('never used') - - expect(described_class.tf(client: client)).to eq <<-EOF -resource "aws_lambda_function" "LamdaFunc1" { - filename = "" - function_name = "LamdaFunc1" - role = "" - handler = "" - description = "" - memory_size = "" - runtime = "" - timeout = "" - source_code_hash = "" -} - EOF - - end - end - end - end - end -end From 0dd0c719e4ca9e5da9b4ff7f118354338ed35347 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Wed, 20 Jul 2016 23:59:12 -0400 Subject: [PATCH 13/17] Revert "Merge branch 'lambda-support' of https://github.com/mattgartman/terraforming into cert-bundle-fix" This reverts commit 51f4caeae1c7f7efd0053ebd8f536b51707f5546, reversing changes made to f9e7d91d98739f11ce5fb706cf3aafb3c7e16f61. --- lib/terraforming.rb | 2 - lib/terraforming/cli.rb | 5 - lib/terraforming/resource/lambda_function.rb | 118 ------------------ .../template/tf/lambda_function.erb | 19 --- 4 files changed, 144 deletions(-) delete mode 100644 lib/terraforming/resource/lambda_function.rb delete mode 100644 lib/terraforming/template/tf/lambda_function.erb diff --git a/lib/terraforming.rb b/lib/terraforming.rb index d7f268da..5b411ed5 100644 --- a/lib/terraforming.rb +++ b/lib/terraforming.rb @@ -13,7 +13,6 @@ require "json" require "thor" require "zlib" -require "net/http" require "terraforming/util" require "terraforming/version" @@ -38,7 +37,6 @@ require "terraforming/resource/iam_role_policy" require "terraforming/resource/iam_user" require "terraforming/resource/iam_user_policy" -require "terraforming/resource/lambda_function" require "terraforming/resource/launch_configuration" require "terraforming/resource/internet_gateway" require "terraforming/resource/nat_gateway" diff --git a/lib/terraforming/cli.rb b/lib/terraforming/cli.rb index b812fe5f..7a4d2d39 100644 --- a/lib/terraforming/cli.rb +++ b/lib/terraforming/cli.rb @@ -104,11 +104,6 @@ def iamup execute(Terraforming::Resource::IAMUserPolicy, options) end - desc "lambdafunction", "Lambda Function" - def lambdafunction - execute(Terraforming::Resource::LambdaFunction, options) - end - desc "lc", "Launch Configuration" def lc execute(Terraforming::Resource::LaunchConfiguration, options) diff --git a/lib/terraforming/resource/lambda_function.rb b/lib/terraforming/resource/lambda_function.rb deleted file mode 100644 index 36815c3e..00000000 --- a/lib/terraforming/resource/lambda_function.rb +++ /dev/null @@ -1,118 +0,0 @@ -module Terraforming - module Resource - class LambdaFunction - include Terraforming::Util - - def self.tf(client: Aws::Lambda::Client.new) - self.new(client).tf - end - - def self.tfstate(client: Aws::Lambda::Client.new) - self.new(client).tfstate - end - - def initialize(client) - @client = client - end - - def tf - apply_template(@client, "tf/lambda_function") - end - - def tfstate - lambda_functions.inject({}) do |resources, instance| - attributes = { - "arn" => instance.configuration.function_arn, - "description" => instance.configuration.description, - "filename" => "#{instance.configuration.function_name}.zip", - "function_name" => instance.configuration.function_name, - "handler" => instance.configuration.handler, - "id" => instance.configuration.function_name, - "last_modified" => instance.configuration - .last_modified - .strftime("%FT%T%z"), - "memory_size" => instance.configuration.memory_size.to_s, - "role" => instance.configuration.role, - "runtime" => instance.configuration.runtime, - "source_code_hash" => instance.configuration.code_sha_256, - "timeout" => instance.configuration.timeout.to_s, - } - unless instance.configuration.vpc_config.nil? - # lambda is only supported in one vpc, hardcoding - attributes["vpc_config.#"] = "1" - - attributes["vpc_config.0.security_group_ids.#"] = - instance.configuration.vpc_config.security_group_ids.count.to_s - instance.configuration.vpc_config.security_group_ids.each do |sg| - crc = Zlib.crc32(sg) - attributes["vpc_config.0.security_group_ids.#{crc}"] = sg - end - - attributes["vpc_config.0.subnet_ids.#"] = - instance.configuration.vpc_config.subnet_ids.count.to_s - instance.configuration.vpc_config.subnet_ids.each do |sn| - crc = Zlib.crc32(sn) - attributes["vpc_config.0.subnet_ids.#{crc}"] = sn - end - end - resources["aws_lambda_function.#{module_name_of(instance)}"] = { - "type" => "aws_lambda_function", - "primary" => { - "id" => instance.configuration.function_name, - "attributes" => attributes - } - } - - resources - end - end - - private - - def download_all_lambda_function_code(all_lambda_functions) - all_lambda_functions.each do |function| - download_lambda_code(function.code.location, - "#{function.configuration.function_name}.zip") - end - end - - def lambda_functions_with_code - functions = lambda_functions - download_all_lambda_function_code(functions) - functions - end - - def lambda_functions - @client.list_functions.functions.inject([]) do |resources, lf| - resources.push(@client.get_function(function_name: lf.function_name)) - resources - end - end - - def download_lambda_code(url, filename) - uri = URI.parse(url) - - http_client = Net::HTTP.new(uri.host, uri.port) - http_client.use_ssl = true - http_client.ca_file = Aws.config[:ssl_ca_bundle] - http_client.verify_mode = OpenSSL::SSL::VERIFY_PEER - - http_client.start do |http| - response = http.get(uri) - - unless response.code == "200" - raise "Error downloading Lambda Code HTTP Res Code #{response.code}" - end - - open filename, 'wb' do |io| - io.write response.body - end - end - end - - def module_name_of(lambda_function) - normalize_module_name(lambda_function.configuration.function_name) - end - end - end -end diff --git a/lib/terraforming/template/tf/lambda_function.erb b/lib/terraforming/template/tf/lambda_function.erb deleted file mode 100644 index 59d8e0d0..00000000 --- a/lib/terraforming/template/tf/lambda_function.erb +++ /dev/null @@ -1,19 +0,0 @@ -<% lambda_functions_with_code.each do |lambda_function| -%> -resource "aws_lambda_function" "<%= lambda_function.configuration.function_name %>" { - filename = "<%= lambda_function.configuration.function_name %>.zip" - function_name = "<%= lambda_function.configuration.function_name %>" - role = "<%= lambda_function.configuration.role %>" - handler = "<%= lambda_function.configuration.handler %>" - description = "<%= lambda_function.configuration.description %>" - memory_size = "<%= lambda_function.configuration.memory_size %>" - runtime = "<%= lambda_function.configuration.runtime %>" - timeout = "<%= lambda_function.configuration.timeout %>" - source_code_hash = "<%= lambda_function.configuration.code_sha_256 %>" -<% unless lambda_function.configuration.vpc_config.nil? -%> - vpc_config { - subnet_ids = <%= lambda_function.configuration.vpc_config.subnet_ids %> - security_group_ids = <%= lambda_function.configuration.vpc_config.security_group_ids %> - } -<% end -%> -} -<% end -%> \ No newline at end of file From b4e24b383e1e6655c5af4ac41e4d6aa382c880c0 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Thu, 21 Jul 2016 00:01:18 -0400 Subject: [PATCH 14/17] Removing aws- prefix --- lib/terraforming/cli.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/terraforming/cli.rb b/lib/terraforming/cli.rb index 7a4d2d39..15118c2c 100644 --- a/lib/terraforming/cli.rb +++ b/lib/terraforming/cli.rb @@ -5,7 +5,7 @@ class CLI < Thor class_option :tfstate, type: :boolean, desc: "Generate tfstate" class_option :profile, type: :string, desc: "AWS credentials profile" class_option :region, type: :string, desc: "AWS region" - class_option :"aws-use-bundled-cert", + class_option :"use-bundled-cert", type: :boolean, desc: "Use the bundled CA certificate from AWS SDK" @@ -205,7 +205,7 @@ def vgw def execute(klass, options) Aws.config[:credentials] = Aws::SharedCredentials.new(profile_name: options[:profile]) if options[:profile] Aws.config[:region] = options[:region] if options[:region] - Aws.use_bundled_cert! if options[:"aws-use-bundled-cert"] + Aws.use_bundled_cert! if options[:"use-bundled-cert"] result = options[:tfstate] ? tfstate(klass, options[:merge]) : tf(klass) if options[:tfstate] && options[:merge] && options[:overwrite] From e76583051cb5c84e36de599aa51b95e87f440433 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Mon, 25 Jul 2016 10:36:30 -0400 Subject: [PATCH 15/17] changing dashes to underscores for bundle parameter symbol --- lib/terraforming/cli.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/terraforming/cli.rb b/lib/terraforming/cli.rb index 15118c2c..d924408b 100644 --- a/lib/terraforming/cli.rb +++ b/lib/terraforming/cli.rb @@ -5,7 +5,7 @@ class CLI < Thor class_option :tfstate, type: :boolean, desc: "Generate tfstate" class_option :profile, type: :string, desc: "AWS credentials profile" class_option :region, type: :string, desc: "AWS region" - class_option :"use-bundled-cert", + class_option :use_bundled_cert, type: :boolean, desc: "Use the bundled CA certificate from AWS SDK" @@ -205,7 +205,7 @@ def vgw def execute(klass, options) Aws.config[:credentials] = Aws::SharedCredentials.new(profile_name: options[:profile]) if options[:profile] Aws.config[:region] = options[:region] if options[:region] - Aws.use_bundled_cert! if options[:"use-bundled-cert"] + Aws.use_bundled_cert! if options[:use_bundled_cert] result = options[:tfstate] ? tfstate(klass, options[:merge]) : tf(klass) if options[:tfstate] && options[:merge] && options[:overwrite] From 2a17a6fc0e30f6a6d021773dd9b60f4e90b794c0 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Mon, 25 Jul 2016 22:06:00 -0400 Subject: [PATCH 16/17] Updating readme to correct cli parameter --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06de463d..125f7f73 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ $ terraforming s3 --profile hoge You can force the AWS SDK to utilize the CA certificate that is bundled with the SDK for systems where the default OpenSSL certificate is not installed (e.g. Windows) by utilizing the `--aws-use-bundled-cert` option. ```bash -PS C:\> terraforming ec2 --aws-use-bundled-cert +PS C:\> terraforming ec2 --use-bundled-cert ``` ## Usage From 21f027fafe63d6f25e2ede432ddfbc903ab7af73 Mon Sep 17 00:00:00 2001 From: Matt Gartman Date: Tue, 26 Jul 2016 07:57:12 -0400 Subject: [PATCH 17/17] removed aws- prefix in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 125f7f73..5f6f2f80 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ aws_secret_access_key = FugaFuga $ terraforming s3 --profile hoge ``` -You can force the AWS SDK to utilize the CA certificate that is bundled with the SDK for systems where the default OpenSSL certificate is not installed (e.g. Windows) by utilizing the `--aws-use-bundled-cert` option. +You can force the AWS SDK to utilize the CA certificate that is bundled with the SDK for systems where the default OpenSSL certificate is not installed (e.g. Windows) by utilizing the `--use-bundled-cert` option. ```bash PS C:\> terraforming ec2 --use-bundled-cert