Cloudflare · Arazzo Workflow

Cloudflare Upsert DNS Record

Version 1.0.0

Find a DNS record by name and update it if present, otherwise create it.

1 workflow 1 source API 1 provider
View Spec View on GitHub AI GatewayAPI GatewayArtificial IntelligenceCDNCloudContainersDDoS ProtectionDNSEdgeEdge ComputingObject StoragePlatformReal-Time CommunicationSecurityServerlessWeb PerformanceArazzoWorkflows

Provider

cloudflare

Workflows

upsert-dns-record
Upsert a DNS record in a zone, matching on the record name.
Searches the zone for a record with the supplied name and either updates the matched record or creates a new one.
3 steps inputs: content, name, type, zoneId outputs: createdRecordId, updatedRecordId
1
findRecord
listDnsRecords
List records in the zone filtered by the supplied name, returning at most one match for the decision.
2
updateExisting
updateDnsRecord
Patch the matched record with the supplied content.
3
createNew
createDnsRecord
Create a new record when no existing record matched the name.

Source API Descriptions

Arazzo Workflow Specification

cloudflare-upsert-dns-record-workflow.yml Raw ↑
arazzo: 1.0.1
info:
  title: Cloudflare Upsert DNS Record
  summary: Find a DNS record by name and update it if present, otherwise create it.
  description: >-
    An idempotent DNS provisioning pattern. The workflow lists records in the
    zone filtered by name, then branches: when a matching record already exists
    it patches that record with the supplied content, and when none is found it
    creates a new record. Every step inlines its request and asserts both the
    documented HTTP 200 status and the Cloudflare {success, result} envelope
    flag so the flow can be read and executed on its own.
  version: 1.0.0
sourceDescriptions:
- name: cloudflareDnsApi
  url: ../openapi/cloudflare-dns-openapi.yml
  type: openapi
workflows:
- workflowId: upsert-dns-record
  summary: Upsert a DNS record in a zone, matching on the record name.
  description: >-
    Searches the zone for a record with the supplied name and either updates the
    matched record or creates a new one.
  inputs:
    type: object
    required:
    - zoneId
    - type
    - name
    - content
    properties:
      zoneId:
        type: string
        description: The unique identifier of the zone.
      type:
        type: string
        description: The DNS record type (e.g. A, AAAA, CNAME, TXT).
      name:
        type: string
        description: The DNS record name to match on and write (e.g. www.example.com).
      content:
        type: string
        description: The DNS record content value to write.
  steps:
  - stepId: findRecord
    description: >-
      List records in the zone filtered by the supplied name, returning at most
      one match for the decision.
    operationId: listDnsRecords
    parameters:
    - name: zone_id
      in: path
      value: $inputs.zoneId
    - name: name
      in: query
      value: $inputs.name
    - name: per_page
      in: query
      value: 1
    successCriteria:
    - condition: $statusCode == 200
    - context: $response.body
      condition: $.success == true
      type: jsonpath
    outputs:
      matchedRecordId: $response.body#/result/0/id
    onSuccess:
    - name: recordExists
      type: goto
      stepId: updateExisting
      criteria:
      - context: $response.body
        condition: $.result.length > 0
        type: jsonpath
    - name: recordMissing
      type: goto
      stepId: createNew
      criteria:
      - context: $response.body
        condition: $.result.length == 0
        type: jsonpath
  - stepId: updateExisting
    description: Patch the matched record with the supplied content.
    operationId: updateDnsRecord
    parameters:
    - name: zone_id
      in: path
      value: $inputs.zoneId
    - name: dns_record_id
      in: path
      value: $steps.findRecord.outputs.matchedRecordId
    requestBody:
      contentType: application/json
      payload:
        type: $inputs.type
        name: $inputs.name
        content: $inputs.content
    successCriteria:
    - condition: $statusCode == 200
    - context: $response.body
      condition: $.success == true
      type: jsonpath
    outputs:
      recordId: $response.body#/result/id
    onSuccess:
    - name: done
      type: end
  - stepId: createNew
    description: Create a new record when no existing record matched the name.
    operationId: createDnsRecord
    parameters:
    - name: zone_id
      in: path
      value: $inputs.zoneId
    requestBody:
      contentType: application/json
      payload:
        type: $inputs.type
        name: $inputs.name
        content: $inputs.content
    successCriteria:
    - condition: $statusCode == 200
    - context: $response.body
      condition: $.success == true
      type: jsonpath
    outputs:
      recordId: $response.body#/result/id
  outputs:
    updatedRecordId: $steps.updateExisting.outputs.recordId
    createdRecordId: $steps.createNew.outputs.recordId