lib/datapimp/cli/create.rb in datapimp-1.2.9 vs lib/datapimp/cli/create.rb in datapimp-1.2.10

- old
+ new

@@ -129,5 +129,100 @@ distribution.save end end end + +# bin/datapimp create cf protected distribution --name z-test --bucket 'warbler.architects.io' --error-bucket z-test-error-bucket --domains hola.com,hello.com --app-url https://blueprints.architects.io --origin-access-identity E2RCKW2LSUD589 --trace +command 'create cf protected distribution' do |c| + c.syntax = "datapimp create cf protected distribution" + c.description = "create a cloudfront PROTECTED distribution using signed cookies" + + Datapimp::Cli.accepts_keys_for(c, :amazon) + + c.option '--name NAME', String, 'The name for this distribution' + c.option '--bucket NAME', String, 'The name of the *existing* bucket that will provide the content' + c.option '--error-bucket NAME', String, 'The name of the *existing* bucket that will hold the errors folder and 403.html file' + c.option '--domains DOMAINS', Array, 'What domains will be pointing to this bucket?' + c.option '--app-url NAME', String, 'The url of the AUTH Applitacion' + c.option '--origin-access-identity NAME', String, 'The Origin Access Identity to be used to create the distribution' + + c.action do |args, options| + cf = Datapimp::Sync.amazon.cloud_formation + + template_body = File.read(File.join(File.dirname(__FILE__), '..', 'templates/cloudfront', 'aws_cloudfront_distribution_template.json')) + + res = cf.create_stack( + stack_name: options.name, + template_body: template_body, + # disable_rollback: true, + parameters: [ + { + parameter_key: "AppLocation", + parameter_value: URI.parse(options.app_url).host, + use_previous_value: true + }, + { + parameter_key: "BucketName", + parameter_value: options.bucket, + use_previous_value: true + }, + { + parameter_key: "ErrorBucketName", + parameter_value: options.error_bucket, + use_previous_value: true + }, + { + parameter_key: "Aliases", + parameter_value: options.domains.join(','), + use_previous_value: true + }, + { + parameter_key: "DistributionComment", + parameter_value: "#{options.name} distribution", + use_previous_value: true + }, + { + parameter_key: "OriginAccessIdentity", + parameter_value: options.origin_access_identity, + use_previous_value: true + } + ] + ) + + begin + puts "Waiting for stack creation process to finish ..." + sleep 30 + stack = cf.describe_stacks(stack_name: options.name).stacks.first + end while stack.stack_status == "CREATE_IN_PROGRESS" + + if stack.stack_status != "CREATE_COMPLETE" + puts "stack failed to create" + exit 1 + end + + s3 = Aws::S3::Client.new(region: cf.config.region) + template_body_403 = ERB.new(File.read(File.join(File.dirname(__FILE__), '../templates/cloudfront', '403.html.erb'))).result(binding) + + # S3 403.html error file + begin + s3.put_object( + bucket: options.error_bucket, + key: 'errors/403.html', + content_type: 'text/html', + cache_control: 'max-age=300', + acl: 'public-read', + body: template_body_403 + ) + rescue Aws::S3::Errors::NoSuchBucket + error_bucket = "#{options.error_bucket}.s3.amazonaws.com" + s3.put_object( + bucket: error_bucket, + key: 'errors/403.html', + content_type: 'text/html', + cache_control: 'max-age=300', + acl: 'public-read', + body: template_body_403 + ) + end + end +end