Terraform Cloud integration

This commit is contained in:
Andrew Atimapre
2023-07-18 21:08:30 +01:00
parent ceeebc24fa
commit 76f43ab6b4
6 changed files with 64 additions and 12 deletions
+2 -1
View File
@@ -1855,6 +1855,7 @@ const syncSecretsTerraformCloud = async ({
Promise.all(payload); Promise.all(payload);
// get secrets from Terraform Cloud // get secrets from Terraform Cloud
// const getSecretsRes = ( // const getSecretsRes = (
// await standardRequest.get( // await standardRequest.get(
@@ -1867,7 +1868,7 @@ const syncSecretsTerraformCloud = async ({
// }, // },
// } // }
// ) // )
// ).data?.data; // ).data;
// delete secrets from Terraform Cloud // delete secrets from Terraform Cloud
// getSecretsRes.forEach(async (data: any) => { // getSecretsRes.forEach(async (data: any) => {
+9 -9
View File
@@ -195,6 +195,15 @@ export const getIntegrationOptions = async () => {
clientId: await getClientIdGitLab(), clientId: await getClientIdGitLab(),
docsLink: "", docsLink: "",
}, },
{
name: "Terraform Cloud",
slug: "terraform-cloud",
image: "Terraform Cloud.png",
isAvailable: true,
type: "pat",
cliendId: "",
docsLink: "",
},
{ {
name: "Travis CI", name: "Travis CI",
slug: "travisci", slug: "travisci",
@@ -222,15 +231,6 @@ export const getIntegrationOptions = async () => {
clientId: "", clientId: "",
docsLink: "", docsLink: "",
}, },
{
name: "Terraform Cloud",
slug: "terraform-cloud",
image: "Terraform Cloud.png",
isAvailable: true,
type: "pat",
cliendId: "",
docsLink: "",
},
{ {
name: "HashiCorp Vault", name: "HashiCorp Vault",
slug: "hashicorp-vault", slug: "hashicorp-vault",
@@ -0,0 +1,42 @@
---
title: "Terraform Cloud"
description: "How to sync secrets from Infisical to Terraform Cloud"
---
Prerequisites:
- Set up and add envars to [Infisical Cloud](https://app.infisical.com)
## Navigate to your project's integrations tab
![integrations](../../images/integrations.png)
## Enter your Terraform Cloud API Token and Workspace Id
Obtain a Terraform Cloud API Token in User Settings > Tokens
![integrations terraform cloud dashboard](../../images/integrations-terraformcloud-dashboard.png)
![integrations terraform cloud tokens](../../images/integrations-terraformcloud-tokens.png)
Obtain your Terraform Cloud Workspace Id in Projects & Workspaces > Workspace > ID
![integrations terraform cloud projects & workspaces](../../images/integrations-terraformcloud-workspaces.png)
![integrations terraform cloud workspace id](../../images/integrations-terraformcloud-workspaceid.png)
Press on the Terraform Cloud tile and input your Terraform Cloud API Token and Workspace Id to grant Infisical access to your Terraform Cloud account.
![integrations terraform cloud authorization](../../images/integrations-terraformcloud-auth.png)
<Info>
If this is your project's first cloud integration, then you'll have to grant
Infisical access to your project's environment variables. Although this step
breaks E2EE, it's necessary for Infisical to sync the environment variables to
the cloud platform.
</Info>
## Start integration
Select which Infisical environment secrets and Terraform Cloud variable type you want to sync to which Terraform Cloud workspace/project and press create integration to start syncing secrets to Terraform Cloud.
![integrations terraform cloud](../../images/integrations-terraformcloud-create.png)
![integrations terraform cloud](../../images/integrations-terraformcloud.png)
+1
View File
@@ -20,6 +20,7 @@ Missing an integration? [Throw in a request](https://github.com/Infisical/infisi
| [Render](/integrations/cloud/render) | Cloud | Available | | [Render](/integrations/cloud/render) | Cloud | Available |
| [Laravel Forge](/integrations/cloud/laravel-forge) | Cloud | Available | | [Laravel Forge](/integrations/cloud/laravel-forge) | Cloud | Available |
| [Railway](/integrations/cloud/railway) | Cloud | Available | | [Railway](/integrations/cloud/railway) | Cloud | Available |
| [Terraform Cloud](/integrations/cloud/terraform-cloud) | Cloud | Available |
| [Fly.io](/integrations/cloud/flyio) | Cloud | Available | | [Fly.io](/integrations/cloud/flyio) | Cloud | Available |
| [Supabase](/integrations/cloud/supabase) | Cloud | Available | | [Supabase](/integrations/cloud/supabase) | Cloud | Available |
| [Cloudflare Pages](/integrations/cloud/cloudflare-pages) | Cloud | Available | | [Cloudflare Pages](/integrations/cloud/cloudflare-pages) | Cloud | Available |
+1 -1
View File
@@ -130,7 +130,6 @@
"self-hosting/deployment-options/standalone-infisical", "self-hosting/deployment-options/standalone-infisical",
"self-hosting/deployment-options/fly.io", "self-hosting/deployment-options/fly.io",
"self-hosting/deployment-options/render", "self-hosting/deployment-options/render",
"self-hosting/deployment-options/laravel-forge",
"self-hosting/deployment-options/digital-ocean-marketplace" "self-hosting/deployment-options/digital-ocean-marketplace"
] ]
}, },
@@ -198,6 +197,7 @@
"integrations/cloud/flyio", "integrations/cloud/flyio",
"integrations/cloud/laravel-forge", "integrations/cloud/laravel-forge",
"integrations/cloud/supabase", "integrations/cloud/supabase",
"integrations/cloud/terraform-cloud",
"integrations/cloud/cloudflare-pages", "integrations/cloud/cloudflare-pages",
"integrations/cloud/checkly", "integrations/cloud/checkly",
"integrations/cloud/hashicorp-vault", "integrations/cloud/hashicorp-vault",
@@ -33,6 +33,7 @@ export default function TerraformCloudCreateIntegrationPage() {
const [targetApp, setTargetApp] = useState(""); const [targetApp, setTargetApp] = useState("");
const [secretPath, setSecretPath] = useState("/"); const [secretPath, setSecretPath] = useState("/");
const [variableType, setVariableType] = useState(""); const [variableType, setVariableType] = useState("");
const [variableTypeErrorText, setVariableTypeErrorText] = useState("");
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
useEffect(() => { useEffect(() => {
@@ -55,6 +56,12 @@ export default function TerraformCloudCreateIntegrationPage() {
try { try {
if (!integrationAuth?._id) return; if (!integrationAuth?._id) return;
setVariableTypeErrorText("");
if (variableType.length === 0 ) {
setVariableTypeErrorText("Variable Type cannot be blank!")
return;
}
setIsLoading(true); setIsLoading(true);
await createIntegration({ await createIntegration({
@@ -119,7 +126,8 @@ export default function TerraformCloudCreateIntegrationPage() {
placeholder="Provide a path, default is /" placeholder="Provide a path, default is /"
/> />
</FormControl> </FormControl>
<FormControl label="Variable Type" className="mt-4"> <FormControl label="Variable Type" className="mt-4" errorText={variableTypeErrorText}
isError={variableTypeErrorText !== "" ?? false}>
<Select <Select
value={variableType} value={variableType}
onValueChange={(val) => setVariableType(val)} onValueChange={(val) => setVariableType(val)}