Giter VIP home page Giter VIP logo

cf-terraforming's Introduction

Cloudflare Terraforming

Go Report Card

Overview

cf-terraforming is a command line utility to facilitate terraforming your existing Cloudflare resources. It does this by using your account credentials to retrieve your configurations from the Cloudflare API and converting them to Terraform configurations that can be used with the Terraform Cloudflare provider.

This tool is ideal if you already have Cloudflare resources defined but want to start managing them via Terraform, and don't want to spend the time to manually write the Terraform configuration to describe them.

Usage

Usage:
  cf-terraforming [command]

Available Commands:
  access_application     Import Access Application data into Terraform
  access_policy          Import Access Policy data into Terraform
  access_rule            Import Access Rule data into Terraform
  account_member         Import Account Member data into Terraform
  all                    Import all Cloudflare resources into Terraform
  custom_pages           Import Custom Pages data into Terraform
  filter                 Import Filter data into Terraform
  firewall_rule          Import Firewall Rule data into Terraform
  help                   Help about any command
  load_balancer          Import a load balancer into Terraform
  load_balancer_monitor  Import a load balancer monitor into Terraform
  load_balancer_pool     Import a load balancer pool into Terraform
  page_rule              Import Page Rule data into Terraform
  rate_limit             Import Rate Limit data into Terraform
  record                 Import Record data into Terraform
  spectrum_application   Import a spectrum application into Terraform
  version                Print the version number of cf-terraforming
  waf_rule               Import WAF Rule data into Terraform
  worker_route           Import a worker route into Terraform
  worker_script          Import a worker script into Terraform
  zone                   Import zone data into Terraform
  zone_lockdown          Import Zone Lockdown data into Terraform
  zone_settings_override Import Zone Settings Override data into Terraform

Flags:
  -a, --account string        Use specific account ID for import
  -c, --config string         config file (default is $HOME/.cf-terraforming.yaml)
  -e, --email string          API Email address associated with your account
  -h, --help                  help for cf-terraforming
  -k, --key string            API Key generated on the 'My Profile' page. See: https://dash.cloudflare.com/?account=profile
  -l, --loglevel string       Specify logging level: (trace, debug, info, warn, error, fatal, panic)
  -o, --organization string   Use specific organization ID for import
  -s, --tfstate               Export tfstate for the given resource instead of HCL Terraform config (default ! See caveats below !)
  -v, --verbose               Specify verbose output (same as setting log level to debug)
  -z, --zone string           Limit the export to a single zone (name or ID)

Use "cf-terraforming [command] --help" for more information about a command.

Example

A note on storing your credentials securely: We recommend that you store your Cloudflare credentials (API key, email, account ID, etc) as environment variables as demonstrated below.

You can use go run to build and execute the binary in a single command like so:

go run cmd/cf-terraforming/main.go --email $CLOUDFLARE_EMAIL --key $CLOUDFLARE_TOKEN --account $CLOUDFLARE_ACCOUNT_ID spectrum_application

will contact the Cloudflare API on your behalf and result in a valid Terraform configuration representing the resource you requested:

resource "cloudflare_spectrum_application" "1150bed3f45247b99f7db9696fffa17cbx9" {
    protocol = "tcp/8000"
    dns = {
        type = "CNAME"
        name = "example.com"
    }
    ip_firewall = "true"
    tls = "off"
    origin_direct = [ "tcp://37.241.37.138:8000", ]
}

See the currently supported resources below.

Download all Cloudflare resources

Use the all command to download everything and convert it into Terraform config.

go run cmd/cf-terraforming/main.go --email $CLOUDFLARE_EMAIL --key $CLOUDFLARE_TOKEN --account $CLOUDFLARE_ACCOUNT_ID all

Controlling output and verbose mode

By default, cf-terraforming will not output any log type messages to stdout when run, so as to not pollute your generated Terraform config files and to allow you to cleanly redirect cf-terraforming output to existing Terraform configs.

However, it can be useful when debugging issues to specify a logging level, like so:

go run cmd/cf-terraforming/main.go --email $CLOUDFLARE_EMAIL --key $CLOUDFLARE_TOKEN -a 1233455678d876bc764b5f763af7644411 -l="debug" spectrum_application

DEBU[0000] Initializing cloudflare-go                    API email=apicloudflare.com Account ID=e9e138b6x52ea331b359a2ddfc6a8 Organization ID= Zone name=example.com
DEBU[0000] Selecting zones for import
DEBU[0000] Zones selected:
DEBU[0000] Zone                                          ID=81b06ss3228f488fh84e5e993c2dc17 Name=example.com
DEBU[0000] Importing zone settings data

For convenience, you can set the verbose flag, which is functionally equivalent to setting a log level of debug:

go run cmd/cf-terraforming/main.go --email $CLOUDFLARE_EMAIL --key $CLOUDFLARE_TOKEN -a 1233455678d876bc764b5f763af7644411 -v spectrum_application

Prerequisites

  • A Cloudflare account with resources defined (e.g. a few zones, some load balancers, spectrum applications, etc)
  • A valid Cloudflare API key and sufficient permissions to access the resources you are requesting via the API
  • A working installation of Go

Installation

$ go get -u github.com/cloudflare/cf-terraforming/...

This will fetch the cf-terraforming tool as well as its dependencies, updating them as necessary.

Experimental: exporting tfstate

Work is underway to support downloading your resources via cf-terraform as valid tfstate, which will allow you to skip importing and let Terraform become aware of and begin managing your resources immediately.

Currently, only the worker_route command supports the --tfstate flag, but support for downloading tfstate will steadily be added across the other resources supported by cf-terraforming.

To use this currently experimental feature, pass the --tfstate (-s) flag to your command like so:

$ go run cmd/cf-terraforming/main.go --email $CLOUDFLARE_EMAIL --key $CLOUDFLARE_API_KEY -z example.com -a $CLOUDFLARE_ACCOUNT_ID --organization $CLOUDFLARE_ORG_ID --tfstate worker_route

The output will look something like this:

{
    "version": 1,
    "terraform_version": "",
    "serial": 0,
    "lineage": "",
    "modules": [
    {
        "path": ["root"],
        "depends_on": [],
        "outputs":
        {},
        "resources":
        {
            "cloudflare_worker_route.3489743985643594723e238ce":
            {
                "primary":
                {
                    "id": "249653298b6041148b411b4723e238ce",
                    "attributes":
                    {
                        "enabled": "true",
                        "id": "249653298b6041148b411b4723e238ce",
                        "multi_script": "true",
                        "pattern": "example.com",
                        "zone": "example.com",
                        "zone_id": "z1b06143shshs3223e5ec83c2z1klop"
                    },
                    "meta":
                    {},
                    "tainted": false
                },
                "depends_on": [],
                "deposed": [],
                "provider": "provider.cloudflare",
                "type": "cloudflare_worker_route"
            },
            "cloudflare_worker_route.zZ3exdfyt3e76274ef25dda436":
            {
                "primary":
                {
                    "id": "9b3e8f2cc874zsde9274ef25dda58f36",
                    "attributes":
                    {
                        "enabled": "true",
                        "id": "9b3e8f2cc87444fb9274ef25dda58f36",
                        "multi_script": "true",
                        "pattern": "example.com/*",
                        "zone": "example.com",
                        "zone_id": "z1b06143shshs3223e5ec83c2z1klop"
                    },
                    "meta":
                    {},
                    "tainted": false
                },
                "depends_on": [],
                "deposed": [],
                "provider": "provider.cloudflare",
                "type": "cloudflare_worker_route"
            }
        }
    }]
}

This means that when you next run $ terraform plan, Terraform should see no difference between your defined resources and your current tfstate.

Supported resources

The following resources can be downloaded into Terraform HCL format right now. Some resources also support the --tfstate flag. Support across the remaining commands will be added over time.

Resource Generating HCL Generating tfstate
access_application ✔️ ✔️
access_policy ✔️ ✔️
access_rule ✔️ ✔️
account_member ✔️ ✖️
custom_pages ✔️ ✖️
filter ✔️ ✔️
firewall_rule ✔️ ✔️
load_balancer ✔️ ✖️
load_balancer_pool ✔️ ✖️
load_balancer_monitor ✔️ ✖️
page_rule ✔️ ✖️
rate_limit ✔️ ✔️
record ✔️ ✔️
spectrum_application ✔️ ✖️
waf_rule ✔️ ✖️
worker_route ✔️ ✔️
worker_script ✔️ ✖️
zone ✔️ ✔️
zone_lockdown ✔️ ✔️
zone_settings_override ✔️ ✖️

cf-terraforming's People

Contributors

jsoref avatar lordmike avatar patryk avatar renovate-bot avatar sean- avatar zackproser avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.