콘텐츠로 이동
📣 인포그랩에서 OpenAI 기술 기반으로 자체 개발한 자동화 번역 프로그램을 통해 n8n 공식 문서의 한글판을 국내 최초로 제공합니다.

임베드에서의 워크플로우 관리#

기능 사용 가능 여부

Embed 기능을 사용하려면 Embed 라이선스가 필요합니다. Embed 사용 시점, 비용 및 라이선스 프로세스에 대한 자세한 내용은 n8n 웹사이트의 Embed 페이지를 참고하세요.

임베드된 n8n 배포를 관리할 때, 팀이나 조직을 대상으로 동일(또는 유사한) 워크플로우를 여러 사용자에 대해 실행해야 할 가능성이 높습니다. 이를 위해 두 가지 옵션이 있습니다:

솔루션 장점 단점
각 사용자별로 워크플로우 생성 워크플로우 시작에 대한 제한이 없음 (모든 트리거 사용 가능) 여러 워크플로우를 관리해야 함.
단일 워크플로우를 생성하고 실행 시 사용자 자격 증명을 전달 간소화된 워크플로우 관리 (하나의 워크플로우만 변경 필요). 워크플로우를 실행하기 위해 제품이 호출해야 함

Warning

이 문서에서 참조한 API는 언제든지 변경될 수 있습니다. 각 버전 업그레이드 시 계속 기능을 확인해야 합니다.

사용자별 워크플로우#

따라야 할 일반적인 단계는 다음과 같습니다:

  • 각 사용자의 자격 증명과 워크플로우에 따라 필요한 추가 매개변수를 확보합니다.
  • 이 사용자를 위한 n8n 자격 증명을 생성합니다.
  • 워크플로우를 생성합니다.

1. 사용자 자격 증명 확보#

여기서는 이 사용자가 인증해야 하는 모든 노드/서비스에 대한 자격 증명을 포착해야 하며, 특정 워크플로우에 필요한 추가 매개변수도 포함해야 합니다. 자격 증명과 필요한 매개변수는 귀하의 워크플로우와 하려는 작업에 따라 달라집니다.

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

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

편집기 UI 사용#

  1. 메뉴에서 자격 증명 > 새로 만들기를 선택합니다.
  2. 드롭다운을 사용하여 생성할 자격 증명 유형을 선택합니다. 예: Airtable. 새 자격 증명 생성 드롭다운
  3. 새 자격 증명 생성 모달에서 사용자의 자격 증명 세부정보를 입력하고 이 자격 증명에 액세스할 노드를 선택합니다. 새 자격 증명 생성 모달
  4. 생성 버튼을 클릭하여 완료하고 저장합니다.

API 사용#

편집기 UI에서 사용되는 프런트엔드 API를 호출하여 동일한 결과를 얻을 수도 있습니다. API 엔드포인트는 다음 형식입니다: https://<n8n-domain>/rest/credentials.

예를 들어, 위의 편집기 UI 예제에서 자격 증명을 생성하기 위한 요청은 다음과 같습니다:

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

요청 본문:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
   "name":"MyAirtable",
   "type":"airtableApi",
   "nodesAccess":[
      {
         "nodeType":"n8n-nodes-base.airtable"
      }
   ],
   "data":{
      "apiKey":"q12we34r5t67yu"
   }
}

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
{
   "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>
    1
    GET https://<n8n-domain>/rest/workflows/1012
    

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

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
{
  "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": "=이번 주에 {{$json[\"totalBooked\"]}}개의 예약된 주문이 있으며, 총 금액은 {{$json[\"bookedSum\"]}}입니다. 내 고유 ID: {{$node[\"HTTP Request\"].parameter[\"headerParametersUi\"][\"parameter\"][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

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

응답에는 새로운 워크플로우의 ID가 포함되어 있으며, 이를 다음 단계에서 사용하게 됩니다.

  1. 마지막으로, 새로운 워크플로우를 활성화합니다:
    1
    PATCH https://<n8n-domain>/rest/workflows/1012
    

추가 값 active를 JSON 페이로드에 포함시킵니다:

1
2
3
4
5
// ...
"active":true,
"settings": {},
"staticData": null,
"tags": []

단일 워크플로우#

이 방법을 구현하기 위해 따라야 할 네 가지 단계가 있습니다:

  • 각 사용자의 자격 증명을 얻고, 워크플로우에 따라 필요한 추가 매개변수를 확보합니다. 위의 사용자 자격 증명 얻기를 참조하세요.
  • 이 사용자의 n8n 자격 증명을 생성합니다. 위의 사용자 자격 증명 생성을 참조하세요.
  • 워크플로우를 생성합니다.
  • 필요에 따라 워크플로우를 호출합니다.

워크플로우 생성#

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

  • 이 워크플로우는 Webhook 노드에 의해 트리거되어야 합니다.
  • 들어오는 웹훅 호출에는 사용자의 자격 증명과 필요한 기타 워크플로우 매개변수가 포함되어야 합니다.
  • 사용자의 자격 증명이 필요한 각 노드는 표현식을 사용하여 노드의 자격 증명 필드가 웹훅 호출에서 제공된 자격 증명을 읽도록 해야 합니다.
  • 워크플로우를 저장하고 활성화하여 Webhook 노드에 대한 프로덕션 URL이 선택되었는지 확인합니다. 자세한 내용은 웹훅 노드를 참조하세요.

워크플로우 호출#

각 신규 사용자 또는 필요한 기존 사용자에 대해 워크플로우 트리거로 정의된 웹훅을 호출하고 필요한 자격 증명(및 기타 워크플로우 매개변수)을 제공합니다.

인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!