Cloud account setup
Cloud connections guide your administrator through granting and verifying access to selected AWS, Azure, or Google Cloud resources. Use them to establish the right identity, check permissions, and track when access needs attention.
On this page
Before you startCreate a connectionSet up AWS accessAWS External IDSet up Azure accessAzure consentSet up Google Cloud accessGCP attribute conditionVerify and inspect statusEdit, bind, and revokeTrust errorsThe current feature supports account setup, verification, and connection management. An active connection does not yet supply credentials to executing flows. Runtime credential issuance and a dagy.connections Python interface are not available. For a working data integration today, configure the credentials supported by your workflow node or Python client, using secrets.
Before you start
Open Integrations → Cloud accounts in the correct workspace. If the feature is unavailable, its API returns 404; your workspace administrator can confirm availability.
For API examples, set $DAGY_API_URL to your workspace API URL and $DAGY_TOKEN to an authenticated token; see authentication. Reading requires connections.read, editing requires connections.write, verification requires connections.verify, and deletion requires connections.delete.
| Provider | Prepare | Administrator access needed |
|---|---|---|
| AWS | Account ID, default region, S3 buckets/prefixes, optional KMS key ARNs | Create an IAM role and policy; create a CloudFormation stack for the guided setup |
| Azure | Entra tenant ID, storage containers or vaults; application ID for your own application | Grant application consent where applicable and assign resource roles |
| Google Cloud | Project ID and number, pool/provider IDs, buckets or datasets | Create workload identity resources and grant IAM access |
Use the setup artifacts generated for your connection. They contain identity values specific to your workspace; substituting values from another connection can break verification or weaken access boundaries.
Create a connection
Choose a provider, a display name, a reference name (slug), and the resources to verify. The slug must contain 2–63 lowercase letters, digits, or hyphens and start with a letter or digit. Display names can contain up to 100 characters.
| Provider | Supported resource identifiers |
|---|---|
| AWS | s3://example-data/raw/*, s3://example-reports |
| Azure | blob://examplestorage/raw, blob://examplestorage/raw/incoming/, keyvault://example-vault |
| Google Cloud | gs://example-data/incoming/*, bq://example-project.sales |
Choose read or readwrite. This determines generated permissions and verification checks. Declare the narrowest resources needed for your intended integration.
curl --fail-with-body "$DAGY_API_URL/cloud-connections" \
-H "Authorization: Bearer $DAGY_TOKEN" \
-H 'Content-Type: application/json' \
--data '{
"name": "Order archive",
"slug": "order-archive",
"provider": "aws",
"auth_mode": "aws_assume_role",
"identity": {"account_id": "123456789012", "home_region": "us-east-1"},
"scope": {"resources": ["s3://example-orders/raw/*"], "access": "read"}
}'The 201 response contains connection and setup objects. Save connection.connection_id for later requests. Setup artifacts can contain callback credentials; share them only with the administrator performing setup.
Set up AWS access
AWS uses aws_assume_role: an IAM role in your account with a connection-specific External ID. This setup does not request long-lived AWS access keys.
- Create the connection with its account ID, default region, and S3 resources.
- Open Setup, review the generated CloudFormation or manual instructions, and create the role and permissions using those exact values.
- For customer-managed KMS encryption, add key ARNs to
scope.kms_key_arns. The key policy must also permit the role to use the key. Reapply generated permissions after changes. - Let the guided stack register the role, or register its ARN manually.
- Run verification and resolve failed checks.
curl --fail-with-body "$DAGY_API_URL/cloud-connections/$CONNECTION_ID/aws/register" \
-H "Authorization: Bearer $DAGY_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"role_arn":"arn:aws:iam::123456789012:role/example-dagy-access"}'Registration starts verification when available. The role must belong to the declared account. Only commercial arn:aws: roles are supported; GovCloud and China partitions are not supported by this connection flow.
Verification checks the account, role trust, attribution permissions, and declared resources. It also tests that missing and incorrect External IDs are rejected.
AWS External ID
ExternalIdNotEnforced means the role can be assumed without the correct External ID. Apply the generated trust policy and verify again. Do not bypass this failed check.
To rotate the External ID, use connection settings or POST /cloud-connections/{id}/external-id/rotate. Regenerate setup, update the role's trust policy, and verify again. Coordinate the Dagy change and cloud policy update.
Set up Azure access
auth_mode | Setup |
|---|---|
azure_federated_multitenant | Consent to the Dagy application, then grant resource roles |
azure_federated_customer_app | Use your application registration with the generated federated identity credential |
azure_client_secret | Use your application ID, client secret, and expiry date; legacy option |
The identity object includes tenant_id, optional subscription_ids, and client_id for customer-application modes. Resources identify Blob Storage containers/prefixes or Key Vaults.
- Create the connection with your tenant and resource details.
- Complete the consent or customer-application setup shown in the wizard.
- Grant generated roles at the resource scope using the supplied Azure CLI commands or Bicep artifact.
- Run verification. Review resource checks after identity verification succeeds.
For legacy mode, send secret: {"client_secret":"...","secret_expires_at":"YYYY-MM-DD"} at creation. Expiry must be in the future and within the accepted two-year range. Stored secrets are not returned. The cloud connection update request has no general secret-replacement field; plan a replacement connection when rotating a legacy credential.
Azure consent
Consent authorizes the application identity; it does not grant storage or vault data access. Complete resource role assignments separately.
For an invalid, expired, or already used consent link, request GET /cloud-connections/{id}/setup?rotate=true and use the new link. Role propagation can delay verification; retry after applying grants. For KeyVaultAccessPolicyModel, use a vault with Azure RBAC authorization and apply generated roles.
Set up Google Cloud access
Choose gcp_wif_aws for direct federated access or gcp_wif_aws_impersonate to impersonate a service account. This setup does not request service-account keys.
The identity object includes project_id, project_number, pool_id, and provider_id. New connections default to dagy-pool and dagy-aws. Impersonation requires service_account_email; billing_project is optional for BigQuery setup.
- Create the connection with project identity and
gs://orbq://resources. - Run generated
gcloudcommands to create the pool and provider. - Apply generated IAM grants to resources and, if applicable, the service account.
- Use uniform bucket-level access for Cloud Storage. Review generated organization-policy and network guidance if your organization restricts federation or resource access.
- Confirm changed pool/provider details with
POST /cloud-connections/{id}/gcp/register, then verify.
Example registration body:
{"pool_id":"dagy-pool","provider_id":"dagy-aws","project_number":"123456789012"}GCP attribute condition
Verification deliberately tries a different identity. AttributeConditionNotEnforced means that identity was accepted. Apply the exact generated attribute condition and verify again. A permissive condition cannot pass setup verification.
Verify and inspect status
curl --fail-with-body -X POST \
"$DAGY_API_URL/cloud-connections/$CONNECTION_ID/verify" \
-H "Authorization: Bearer $DAGY_TOKEN"
curl --fail-with-body \
"$DAGY_API_URL/cloud-connections/$CONNECTION_ID/verification" \
-H "Authorization: Bearer $DAGY_TOKEN"202 means verification was accepted, not that access passed. Poll until the report is no longer queued or running. Inspect verification.checks, verification.summary, and verification.blocking_error alongside connection status.
| Status | Action |
|---|---|
pending_setup | Complete setup and registration |
pending_admin_approval | Complete Azure administrator consent |
verifying | Wait for verification |
pending_rbac | Apply grants, allow propagation, and recheck |
active | Setup passed; review the runtime limitation above |
degraded | Inspect failed checks or changed scope and verify again |
disabled | Enable before verifying |
revoked | Restore provider trust/access or replace the connection |
Edit, bind, and revoke
PATCH /cloud-connections/{id} accepts name, description, scope, bindings, and pre-activation identity changes. Changing scope on an active connection marks it degraded until permissions are updated and verified. Identity is editable only in pending_setup or pending_admin_approval.
Use PUT /cloud-connections/{id}/bindings to save intended environment restrictions:
{
"environments": {
"production": {
"enabled": true,
"locations": ["dagy-aws"],
"deployments": ["orders-production"],
"max_ttl_seconds": 3600
}
},
"require_declaration": true
}Bindings are saved configuration. They do not currently enforce access in executing flows because runtime credential issuance is not implemented.
Use POST /cloud-connections/{id}/disable or /enable to change the record's enabled state. To revoke provider access, also remove or disable trust/grants in your cloud account. DELETE /cloud-connections/{id} returns 204 and removes the registration; it does not delete your cloud resources.
Trust errors
Cloud-specific failures have an object inside detail containing error_class, message, retryable, and remediation guidance. Use that guidance and the verification report rather than matching human-readable strings.
| Error | Resolution |
|---|---|
TrustConfigurationError | Compare the role, application, or pool with newly generated setup |
PermissionDenied | Check resource policies and selected scope after identity verification passes |
ConsentMissing | Complete Azure consent and retry |
CredentialExpiredUpstream | Replace the expired legacy credential/connection |
ResourceClaimedByAnotherOrg (409) | Confirm the workspace; coordinate ownership transfer with administrators |
TransientProviderError, ProviderUnavailable | Retry with delay when retryable is true; contact support for persistent failures |
FederationNotConfigured, ProviderSdkMissing | Contact your administrator or Dagy support with the verification ID |
ValidationError (422) | Correct the field named in detail.fields |
Limits: 50 connections per workspace, 25 resources per connection, 10 AWS KMS keys per connection, and accepted TTL settings of 900–3,600 seconds. These settings do not guarantee runtime credential availability.
See the API reference for all connection operations.