InfoGrab Docs

Embed에서 워크플로 관리

요약

Embed를 사용하려면 embed 라이선스가 필요합니다. 임베디드 n8n 배포를 팀이나 조직 전반에 걸쳐 관리할 때, 여러 사용자에게 동일한(또는 유사한) 워크플로를 실행해야 하는 경우가 많습니다. 이 문서에서 참조하는 API는 언제든지 변경될 수 있습니다.

기능 제공 범위

Embed를 사용하려면 embed 라이선스가 필요합니다. Embed 사용 시기, 비용 및 라이선스 절차에 대한 자세한 내용은 n8n 웹사이트의 Embed를 참조하세요.

임베디드 n8n 배포를 팀이나 조직 전반에 걸쳐 관리할 때, 여러 사용자에게 동일한(또는 유사한) 워크플로를 실행해야 하는 경우가 많습니다. 이를 위해 두 가지 옵션을 사용할 수 있습니다:

솔루션 장점 단점
각 사용자별 워크플로 생성 워크플로 시작 방식에 제한 없음 (모든 트리거 사용 가능) 여러 워크플로를 관리해야 함.
단일 워크플로 생성 후 실행 시 사용자 자격증명 전달 간소화된 워크플로 관리 (하나의 워크플로만 변경하면 됨). 워크플로를 실행하려면 제품에서 호출해야 함
Warning

이 문서에서 참조하는 API는 언제든지 변경될 수 있습니다. 버전 업그레이드 시마다 기능이 계속 작동하는지 반드시 확인하세요.

사용자별 워크플로#

따라야 할 세 가지 일반 단계가 있습니다:

  • 각 사용자의 자격증명과 워크플로에 필요한 추가 파라미터를 수집합니다.
  • 이 사용자를 위한 n8n 자격증명을 생성합니다.
  • 워크플로를 생성합니다.

1. 사용자 자격증명 수집#

여기서 이 사용자가 인증해야 하는 모든 노드/서비스에 대한 자격증명과 특정 워크플로에 필요한 추가 파라미터를 캡처해야 합니다. 필요한 자격증명 및 파라미터는 워크플로와 수행하려는 작업에 따라 달라집니다.

2. 사용자 자격증명 생성#

모든 관련 자격증명 세부 정보를 수집한 후, n8n에서 관련 서비스 자격증명을 생성할 수 있습니다. 이는 Editor UI 또는 API 호출을 통해 수행할 수 있습니다.

Editor UI 사용#

  1. 메뉴에서 Credentials > New를 선택합니다.
  2. 드롭다운을 사용하여 생성할 Credential type을 선택합니다. 예: Airtable. Create New Credentials drop-down
  3. Create New Credentials 모달에서 사용자의 자격증명 세부 정보를 입력하고 이 자격증명에 접근할 수 있는 노드를 선택합니다. Create New Credentials modal
  4. Create를 클릭하여 완료 및 저장합니다.

API 사용#

Editor UI가 사용하는 프론트엔드 API를 호출하여 동일한 결과를 얻을 수도 있습니다. API 엔드포인트 형식은 https://<n8n-domain>/rest/credentials입니다.

예를 들어, 위의 Editor UI 예시에서 자격증명을 생성하려면 요청은 다음과 같습니다:

POST https://<n8n-domain>/rest/credentials

요청 본문:

{
   "name":"MyAirtable",
   "type":"airtableApi",
   "nodesAccess":[
      {
         "nodeType":"n8n-nodes-base.airtable"
      }
   ],
   "data":{
      "apiKey":"q12we34r5t67yu"
   }
}

응답에는 새 자격증명의 ID가 포함되며, 이 사용자를 위한 워크플로를 생성할 때 사용합니다:

{
   "data":{
      "name":"MyAirtable",
      "type":"airtableApi",
      "data":{
         "apiKey":"q12we34r5t67yu"
      },
      "nodesAccess":[
         {
            "nodeType":"n8n-nodes-base.airtable",
            "date":"2021-09-10T07:41:27.770Z"
         }
      ],
      "id":"29",
      "createdAt":"2021-09-10T07:41:27.777Z",
      "updatedAt":"2021-09-10T07:41:27.777Z"
   }
}

3. 워크플로 생성#

모범 사례는 "기본" 워크플로를 갖추고, 새 사용자마다 복제 후 해당 사용자의 자격증명(및 기타 세부 정보)으로 커스터마이징하는 것입니다.

Editor UI 또는 API 호출을 사용하여 템플릿 워크플로를 복제하고 커스터마이징할 수 있습니다.

Editor UI 사용#

  1. 메뉴에서 Workflows > Open을 선택하여 복제할 템플릿 워크플로를 엽니다.

  2. Workflows > Duplicate를 선택한 다음 새 워크플로 이름을 입력하고 Save를 클릭합니다. Duplicate workflow

  3. 모든 관련 노드를 업데이트하여 이 사용자의 자격증명(위에서 생성한)을 사용하도록 합니다.

  4. 이 워크플로를 Save하고 오른쪽 상단 모서리의 토글을 사용하여 Active로 설정합니다.

API 사용#

  1. 다음 엔드포인트를 사용하여 템플릿 워크플로의 JSON을 가져옵니다: https://<n8n-domain>/rest/workflows/<workflow_id>
GET https://<n8n-domain>/rest/workflows/1012

응답에는 선택한 워크플로의 JSON 데이터가 포함됩니다:

{
  "data": {
    "id": "1012",
    "name": "Nathan's Workflow",
    "active": false,
    "nodes": [
      {
        "parameters": {},
        "name": "Start",
        "type": "n8n-nodes-base.start",
        "typeVersion": 1,
        "position": [
          130,
          640
        ]
      },
      {
        "parameters": {
          "authentication": "headerAuth",
          "url": "https://internal.users.n8n.cloud/webhook/custom-erp",
          "options": {
            "splitIntoItems": true
          },
          "headerParametersUi": {
            "parameter": [
              {
                "name": "unique_id",
                "value": "recLhLYQbzNSFtHNq"
              }
            ]
          }
        },
        "name": "HTTP Request",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 1,
        "position": [
          430,
          300
        ],
        "credentials": {
          "httpHeaderAuth": "beginner_course"
        }
      },
      {
        "parameters": {
          "operation": "append",
          "application": "appKBGQfbm6NfW6bv",
          "table": "processingOrders",
          "options": {}
        },
        "name": "Airtable",
        "type": "n8n-nodes-base.airtable",
        "typeVersion": 1,
        "position": [
          990,
          210
        ],
        "credentials": {
          "airtableApi": "Airtable"
        }
      },
      {
        "parameters": {
          "conditions": {
            "string": [
              {
                "value1": "={{$json[\"orderStatus\"]}}",
                "value2": "processing"
              }
            ]
          }
        },
        "name": "IF",
        "type": "n8n-nodes-base.if",
        "typeVersion": 1,
        "position": [
          630,
          300
        ]
      },
      {
        "parameters": {
          "keepOnlySet": true,
          "values": {
            "number": [
              {
                "name": "=orderId",
                "value": "={{$json[\"orderID\"]}}"
              }
            ],
            "string": [
              {
                "name": "employeeName",
                "value": "={{$json[\"employeeName\"]}}"
              }
            ]
          },
          "options": {}
        },
        "name": "Set",
        "type": "n8n-nodes-base.set",
        "typeVersion": 1,
        "position": [
          800,
          210
        ]
      },
      {
        "parameters": {
          "functionCode": "let totalBooked = items.length;\nlet bookedSum = 0;\n\nfor(let i=0; i < items.length; i++) {\n  bookedSum = bookedSum + items[i].json.orderPrice;\n}\nreturn [{json:{totalBooked, bookedSum}}]\n"
        },
        "name": "Function",
        "type": "n8n-nodes-base.function",
        "typeVersion": 1,
        "position": [
          800,
          400
        ]
      },
      {
        "parameters": {
          "webhookUri": "https://discord.com/api/webhooks/865213348202151968/oD5_WPDQwtr22Vjd_82QP3-_4b_lGhAeM7RynQ8Js5DzyXrQEnj0zeAQIA6fki1JLtXE",
          "text": "=This week we have {{$json[\"totalBooked\"]}} booked orders with a total value of {{$json[\"bookedSum\"]}}. My Unique ID: {{ $(\"HTTP Request\").params.headerParameters.parameters[0].value }}"
        },
        "name": "Discord",
        "type": "n8n-nodes-base.discord",
        "typeVersion": 1,
        "position": [
          1000,
          400
        ]
      },
      {
        "parameters": {
          "triggerTimes": {
            "item": [
              {
                "mode": "everyWeek",
                "hour": 9
              }
            ]
          }
        },
        "name": "Cron",
        "type": "n8n-nodes-base.cron",
        "typeVersion": 1,
        "position": [
          220,
          300
        ]
      }
    ],
    "connections": {
      "HTTP Request": {
        "main": [
          [
            {
              "node": "IF",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Start": {
        "main": [
          []
        ]
      },
      "IF": {
        "main": [
          [
            {
              "node": "Set",
              "type": "main",
              "index": 0
            }
          ],
          [
            {
              "node": "Function",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Set": {
        "main": [
          [
            {
              "node": "Airtable",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Function": {
        "main": [
          [
            {
              "node": "Discord",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Cron": {
        "main": [
          [
            {
              "node": "HTTP Request",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    },
    "createdAt": "2021-07-16T11:15:46.066Z",
    "updatedAt": "2021-07-16T12:05:44.045Z",
    "settings": {},
    "staticData": null,
    "tags": []
  }
}
  1. 반환된 JSON 데이터를 저장하고 새 사용자를 위한 관련 자격증명 및 필드를 업데이트합니다.

  2. 업데이트된 JSON을 요청 본문으로 사용하여 엔드포인트 https://<n8n-domain>/rest/workflows에서 새 워크플로를 생성합니다:

POST https://<n8n-domain>/rest/workflows/

응답에는 새 워크플로의 ID가 포함되며, 다음 단계에서 사용합니다.

  1. 마지막으로 새 워크플로를 게시합니다:
PATCH https://<n8n-domain>/rest/workflows/1012

JSON 페이로드에 active 값을 추가하여 전달합니다:

// ...
"active":true,
"settings": {},
"staticData": null,
"tags": []

단일 워크플로#

이 방법을 구현하려면 네 가지 단계를 따라야 합니다:

  • 각 사용자의 자격증명과 워크플로에 필요한 추가 파라미터를 수집합니다. 위의 사용자 자격증명 수집을 참조하세요.
  • 이 사용자를 위한 n8n 자격증명을 생성합니다. 위의 사용자 자격증명 생성을 참조하세요.
  • 워크플로를 생성합니다.
  • 필요에 따라 워크플로를 호출합니다.

워크플로 생성#

이 워크플로의 세부 사항과 범위는 개별 사용 사례에 따라 크게 달라지지만, 염두에 두어야 할 몇 가지 설계 구현 사항이 있습니다:

  • 이 워크플로는 Webhook 노드에 의해 트리거되어야 합니다.
  • 들어오는 웹훅 호출에는 사용자의 자격증명 및 필요한 기타 워크플로 파라미터가 포함되어야 합니다.
  • 사용자의 자격증명이 필요한 각 노드는 표현식을 사용하여 웹훅 호출에서 제공된 자격증명을 읽도록 해야 합니다.
  • 워크플로를 저장하고 게시하되, Webhook 노드에서 프로덕션 URL이 선택되어 있는지 확인합니다. 자세한 내용은 webhook 노드를 참조하세요.

워크플로 호출#

각 새 사용자 또는 필요에 따라 기존 사용자에 대해, 워크플로 트리거로 정의된 웹훅을 호출하고 필요한 자격증명(및 기타 워크플로 파라미터)을 제공합니다.

Embed에서 워크플로 관리

원문 보기
요약

Embed를 사용하려면 embed 라이선스가 필요합니다. 임베디드 n8n 배포를 팀이나 조직 전반에 걸쳐 관리할 때, 여러 사용자에게 동일한(또는 유사한) 워크플로를 실행해야 하는 경우가 많습니다. 이 문서에서 참조하는 API는 언제든지 변경될 수 있습니다.

기능 제공 범위

Embed를 사용하려면 embed 라이선스가 필요합니다. Embed 사용 시기, 비용 및 라이선스 절차에 대한 자세한 내용은 n8n 웹사이트의 Embed를 참조하세요.

임베디드 n8n 배포를 팀이나 조직 전반에 걸쳐 관리할 때, 여러 사용자에게 동일한(또는 유사한) 워크플로를 실행해야 하는 경우가 많습니다. 이를 위해 두 가지 옵션을 사용할 수 있습니다:

솔루션 장점 단점
각 사용자별 워크플로 생성 워크플로 시작 방식에 제한 없음 (모든 트리거 사용 가능) 여러 워크플로를 관리해야 함.
단일 워크플로 생성 후 실행 시 사용자 자격증명 전달 간소화된 워크플로 관리 (하나의 워크플로만 변경하면 됨). 워크플로를 실행하려면 제품에서 호출해야 함
Warning

이 문서에서 참조하는 API는 언제든지 변경될 수 있습니다. 버전 업그레이드 시마다 기능이 계속 작동하는지 반드시 확인하세요.

사용자별 워크플로#

따라야 할 세 가지 일반 단계가 있습니다:

  • 각 사용자의 자격증명과 워크플로에 필요한 추가 파라미터를 수집합니다.
  • 이 사용자를 위한 n8n 자격증명을 생성합니다.
  • 워크플로를 생성합니다.

1. 사용자 자격증명 수집#

여기서 이 사용자가 인증해야 하는 모든 노드/서비스에 대한 자격증명과 특정 워크플로에 필요한 추가 파라미터를 캡처해야 합니다. 필요한 자격증명 및 파라미터는 워크플로와 수행하려는 작업에 따라 달라집니다.

2. 사용자 자격증명 생성#

모든 관련 자격증명 세부 정보를 수집한 후, n8n에서 관련 서비스 자격증명을 생성할 수 있습니다. 이는 Editor UI 또는 API 호출을 통해 수행할 수 있습니다.

Editor UI 사용#

  1. 메뉴에서 Credentials > New를 선택합니다.
  2. 드롭다운을 사용하여 생성할 Credential type을 선택합니다. 예: Airtable. Create New Credentials drop-down
  3. Create New Credentials 모달에서 사용자의 자격증명 세부 정보를 입력하고 이 자격증명에 접근할 수 있는 노드를 선택합니다. Create New Credentials modal
  4. Create를 클릭하여 완료 및 저장합니다.

API 사용#

Editor UI가 사용하는 프론트엔드 API를 호출하여 동일한 결과를 얻을 수도 있습니다. API 엔드포인트 형식은 https://<n8n-domain>/rest/credentials입니다.

예를 들어, 위의 Editor UI 예시에서 자격증명을 생성하려면 요청은 다음과 같습니다:

POST https://<n8n-domain>/rest/credentials

요청 본문:

{
   "name":"MyAirtable",
   "type":"airtableApi",
   "nodesAccess":[
      {
         "nodeType":"n8n-nodes-base.airtable"
      }
   ],
   "data":{
      "apiKey":"q12we34r5t67yu"
   }
}

응답에는 새 자격증명의 ID가 포함되며, 이 사용자를 위한 워크플로를 생성할 때 사용합니다:

{
   "data":{
      "name":"MyAirtable",
      "type":"airtableApi",
      "data":{
         "apiKey":"q12we34r5t67yu"
      },
      "nodesAccess":[
         {
            "nodeType":"n8n-nodes-base.airtable",
            "date":"2021-09-10T07:41:27.770Z"
         }
      ],
      "id":"29",
      "createdAt":"2021-09-10T07:41:27.777Z",
      "updatedAt":"2021-09-10T07:41:27.777Z"
   }
}

3. 워크플로 생성#

모범 사례는 "기본" 워크플로를 갖추고, 새 사용자마다 복제 후 해당 사용자의 자격증명(및 기타 세부 정보)으로 커스터마이징하는 것입니다.

Editor UI 또는 API 호출을 사용하여 템플릿 워크플로를 복제하고 커스터마이징할 수 있습니다.

Editor UI 사용#

  1. 메뉴에서 Workflows > Open을 선택하여 복제할 템플릿 워크플로를 엽니다.

  2. Workflows > Duplicate를 선택한 다음 새 워크플로 이름을 입력하고 Save를 클릭합니다. Duplicate workflow

  3. 모든 관련 노드를 업데이트하여 이 사용자의 자격증명(위에서 생성한)을 사용하도록 합니다.

  4. 이 워크플로를 Save하고 오른쪽 상단 모서리의 토글을 사용하여 Active로 설정합니다.

API 사용#

  1. 다음 엔드포인트를 사용하여 템플릿 워크플로의 JSON을 가져옵니다: https://<n8n-domain>/rest/workflows/<workflow_id>
GET https://<n8n-domain>/rest/workflows/1012

응답에는 선택한 워크플로의 JSON 데이터가 포함됩니다:

{
  "data": {
    "id": "1012",
    "name": "Nathan's Workflow",
    "active": false,
    "nodes": [
      {
        "parameters": {},
        "name": "Start",
        "type": "n8n-nodes-base.start",
        "typeVersion": 1,
        "position": [
          130,
          640
        ]
      },
      {
        "parameters": {
          "authentication": "headerAuth",
          "url": "https://internal.users.n8n.cloud/webhook/custom-erp",
          "options": {
            "splitIntoItems": true
          },
          "headerParametersUi": {
            "parameter": [
              {
                "name": "unique_id",
                "value": "recLhLYQbzNSFtHNq"
              }
            ]
          }
        },
        "name": "HTTP Request",
        "type": "n8n-nodes-base.httpRequest",
        "typeVersion": 1,
        "position": [
          430,
          300
        ],
        "credentials": {
          "httpHeaderAuth": "beginner_course"
        }
      },
      {
        "parameters": {
          "operation": "append",
          "application": "appKBGQfbm6NfW6bv",
          "table": "processingOrders",
          "options": {}
        },
        "name": "Airtable",
        "type": "n8n-nodes-base.airtable",
        "typeVersion": 1,
        "position": [
          990,
          210
        ],
        "credentials": {
          "airtableApi": "Airtable"
        }
      },
      {
        "parameters": {
          "conditions": {
            "string": [
              {
                "value1": "={{$json[\"orderStatus\"]}}",
                "value2": "processing"
              }
            ]
          }
        },
        "name": "IF",
        "type": "n8n-nodes-base.if",
        "typeVersion": 1,
        "position": [
          630,
          300
        ]
      },
      {
        "parameters": {
          "keepOnlySet": true,
          "values": {
            "number": [
              {
                "name": "=orderId",
                "value": "={{$json[\"orderID\"]}}"
              }
            ],
            "string": [
              {
                "name": "employeeName",
                "value": "={{$json[\"employeeName\"]}}"
              }
            ]
          },
          "options": {}
        },
        "name": "Set",
        "type": "n8n-nodes-base.set",
        "typeVersion": 1,
        "position": [
          800,
          210
        ]
      },
      {
        "parameters": {
          "functionCode": "let totalBooked = items.length;\nlet bookedSum = 0;\n\nfor(let i=0; i < items.length; i++) {\n  bookedSum = bookedSum + items[i].json.orderPrice;\n}\nreturn [{json:{totalBooked, bookedSum}}]\n"
        },
        "name": "Function",
        "type": "n8n-nodes-base.function",
        "typeVersion": 1,
        "position": [
          800,
          400
        ]
      },
      {
        "parameters": {
          "webhookUri": "https://discord.com/api/webhooks/865213348202151968/oD5_WPDQwtr22Vjd_82QP3-_4b_lGhAeM7RynQ8Js5DzyXrQEnj0zeAQIA6fki1JLtXE",
          "text": "=This week we have {{$json[\"totalBooked\"]}} booked orders with a total value of {{$json[\"bookedSum\"]}}. My Unique ID: {{ $(\"HTTP Request\").params.headerParameters.parameters[0].value }}"
        },
        "name": "Discord",
        "type": "n8n-nodes-base.discord",
        "typeVersion": 1,
        "position": [
          1000,
          400
        ]
      },
      {
        "parameters": {
          "triggerTimes": {
            "item": [
              {
                "mode": "everyWeek",
                "hour": 9
              }
            ]
          }
        },
        "name": "Cron",
        "type": "n8n-nodes-base.cron",
        "typeVersion": 1,
        "position": [
          220,
          300
        ]
      }
    ],
    "connections": {
      "HTTP Request": {
        "main": [
          [
            {
              "node": "IF",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Start": {
        "main": [
          []
        ]
      },
      "IF": {
        "main": [
          [
            {
              "node": "Set",
              "type": "main",
              "index": 0
            }
          ],
          [
            {
              "node": "Function",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Set": {
        "main": [
          [
            {
              "node": "Airtable",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Function": {
        "main": [
          [
            {
              "node": "Discord",
              "type": "main",
              "index": 0
            }
          ]
        ]
      },
      "Cron": {
        "main": [
          [
            {
              "node": "HTTP Request",
              "type": "main",
              "index": 0
            }
          ]
        ]
      }
    },
    "createdAt": "2021-07-16T11:15:46.066Z",
    "updatedAt": "2021-07-16T12:05:44.045Z",
    "settings": {},
    "staticData": null,
    "tags": []
  }
}
  1. 반환된 JSON 데이터를 저장하고 새 사용자를 위한 관련 자격증명 및 필드를 업데이트합니다.

  2. 업데이트된 JSON을 요청 본문으로 사용하여 엔드포인트 https://<n8n-domain>/rest/workflows에서 새 워크플로를 생성합니다:

POST https://<n8n-domain>/rest/workflows/

응답에는 새 워크플로의 ID가 포함되며, 다음 단계에서 사용합니다.

  1. 마지막으로 새 워크플로를 게시합니다:
PATCH https://<n8n-domain>/rest/workflows/1012

JSON 페이로드에 active 값을 추가하여 전달합니다:

// ...
"active":true,
"settings": {},
"staticData": null,
"tags": []

단일 워크플로#

이 방법을 구현하려면 네 가지 단계를 따라야 합니다:

  • 각 사용자의 자격증명과 워크플로에 필요한 추가 파라미터를 수집합니다. 위의 사용자 자격증명 수집을 참조하세요.
  • 이 사용자를 위한 n8n 자격증명을 생성합니다. 위의 사용자 자격증명 생성을 참조하세요.
  • 워크플로를 생성합니다.
  • 필요에 따라 워크플로를 호출합니다.

워크플로 생성#

이 워크플로의 세부 사항과 범위는 개별 사용 사례에 따라 크게 달라지지만, 염두에 두어야 할 몇 가지 설계 구현 사항이 있습니다:

  • 이 워크플로는 Webhook 노드에 의해 트리거되어야 합니다.
  • 들어오는 웹훅 호출에는 사용자의 자격증명 및 필요한 기타 워크플로 파라미터가 포함되어야 합니다.
  • 사용자의 자격증명이 필요한 각 노드는 표현식을 사용하여 웹훅 호출에서 제공된 자격증명을 읽도록 해야 합니다.
  • 워크플로를 저장하고 게시하되, Webhook 노드에서 프로덕션 URL이 선택되어 있는지 확인합니다. 자세한 내용은 webhook 노드를 참조하세요.

워크플로 호출#

각 새 사용자 또는 필요에 따라 기존 사용자에 대해, 워크플로 트리거로 정의된 웹훅을 호출하고 필요한 자격증명(및 기타 워크플로 파라미터)을 제공합니다.