title: Terraform remote state in Jenkins
body: <p>am working on a declarative Jenkins pipeline for Terraform deployments. I want to have the terraform state stored remotely in my s3  I get an error </p>
  
  <pre><code>terraform apply -input=false ow.plan
  [31mFailed to load Terraform configuration or plan: open ow.plan: no such file or directory
  </code></pre>
  
  <p>Any suggestions?</p>
  
  <p>Here's my code:</p>
  
  <pre><code> pipeline {
  
      agent any
  
     tools {
          "org.jenkinsci.plugins.terraform.TerraformInstallation" "terraform"
      }
  
     parameters {
      choice(name: 'action', choices: 'create\ndestroy', description: 'Create/update or destroy the eks cluster.')
      string(name: 'cluster', defaultValue : 'demo', description: "EKS cluster name;eg demo creates cluster named eks-demo.")
      string(name: 'vpc_network', defaultValue : '10.0', description: "First 2 octets of vpc network; eg 10.0")
      string(name: 'num_subnets', defaultValue : '3', description: "Number of vpc subnets/AZs.")
      string(name: 'instance_type', defaultValue : 'm4.large', description: "k8s worker node instance type.")
      string(name: 'num_workers', defaultValue : '3', description: "k8s number of worker instances.")
      string(name: 'api_ingress_cidrs', defaultValue : '0.0.0.0/0', description: "k8s api ingress cidrs; space delimited list.")
      string(name: 'jenkinsfile', defaultValue : '', description: "Jenkins credential that provides the AWS access key and secret.")
      string(name: 'region', defaultValue : 'eu-west-1', description: "AWS region.")
    }
  
    environment {
          TF_HOME = tool('terraform')
          TF_IN_AUTOMATION = "true"
          PATH = "$TF_HOME:$PATH"
          AWS_ACCESS_KEY_ID = credentials('AWS_ACCESS_KEY_ID')
          AWS_SECRET_ACCESS_KEY = credentials('AWS_SECRET_ACCESS_KEY')
          TF_VAR_access_key = credentials('AWS_ACCESS_KEY_ID')
          TF_VAR_secret_key = credentials('AWS_SECRET_ACCESS_KEY')
      } 
  
  
  
  
  
    stages {
  
      stage('Setup') {
        steps {
          script {
            currentBuild.displayName = "#" + env.BUILD_NUMBER + " " + params.action + " eks-" + params.cluster
            plan = params.cluster + '.plan'
          }
        }
      }
  
      stage('TF Plan') {
        when {
          expression { params.action == 'create' }
        }
        steps {
          dir('infra/terraform/eks'){   
          script {
            withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', 
              credentialsId: awsCredentialsId,
              accessKeyVariable: 'AWS_ACCESS_KEY_ID',  
              secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
  
              // Format cidrs into a list array
              def ips = '["' + params.api_ingress_cidrs.replaceAll(/\s+/,'\",\"') + '"]'
  
              sh """
                terraform init
                terraform workspace new ${params.cluster} || true
                terraform workspace select ${params.cluster}
                terraform plan \
                  -var cluster-name=${params.cluster} \
                  -var vpc-network=${params.vpc_network} \
                  -var vpc-subnets=${params.num_subnets} \
                  -var inst-type=${params.instance_type} \
                  -var num-workers=${params.num_workers} \
                  -var 'api-ingress-ips=${ips}' \
                  -out ${plan}
              """
            }
          }
          }
        }
      }
  
      stage('TF Apply') {
        when {
          expression { params.action == 'create' }
        }
        steps {
          script {
            input "Create/update Terraform stack eks-${params.cluster} in aws?" 
  
            withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', 
              credentialsId: awsCredentialsId, 
              accessKeyVariable: 'AWS_ACCESS_KEY_ID',  
              secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
  
              sh """
                terraform apply -input=false ${plan}
              """
            }
          }
        }
      }
  
      stage('TF Destroy') {
        when {
          expression { params.action == 'destroy' }
        }
        steps {
          script {
            input "Destroy Terraform stack eks-${params.cluster} in aws?" 
  
            withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', 
              credentialsId: awsCredentialsId, 
              accessKeyVariable: 'AWS_ACCESS_KEY_ID',  
              secretKeyVariable: 'AWS_SECRET_ACCESS_KEY']]) {
  
              sh """
                terraform workspace select ${params.cluster}
                terraform destroy -auto-approve
              """
            }
          }
        }
      }
  
    }
  
  }
  </code></pre>