Implementatiestacks
Een Azure-implementatiestack is een resource waarmee u een groep Azure-resources kunt beheren als één, samenhangende eenheid. Wanneer u een Bicep-bestand of een ARM JSON-sjabloon verzendt naar een implementatiestack, worden de resources gedefinieerd die door de stack worden beheerd. Als een resource die eerder in de sjabloon is opgenomen, wordt deze losgekoppeld of verwijderd op basis van het opgegeven actionOnUnmanage-gedrag van de implementatiestack. Toegang tot de implementatiestack kan worden beperkt met behulp van op rollen gebaseerd toegangsbeheer van Azure (Azure RBAC), vergelijkbaar met andere Azure-resources.
Als u een implementatiestack wilt maken en bijwerken, kunt u Azure CLI, Azure PowerShell of Azure Portal gebruiken, samen met Bicep-bestanden. Deze Bicep-bestanden worden getranspileerd in ARM JSON-sjablonen, die vervolgens worden geïmplementeerd als een implementatieobject door de stack. De implementatiestack biedt extra mogelijkheden buiten de vertrouwde implementatiebronnen, die fungeren als een superset van deze mogelijkheden.
Microsoft.Resources/deploymentStacks
is het resourcetype voor implementatiestacks. Het bestaat uit een hoofdsjabloon die 1-op-veel-updates kan uitvoeren voor de resources die worden beschreven en eventuele ongewenste wijzigingen in deze resources blokkeren.
Wanneer u uw implementatie plant en bepaalt welke resourcegroepen deel moeten uitmaken van dezelfde stack, is het belangrijk om rekening te houden met de levenscyclus van deze resources, waaronder het maken, bijwerken en verwijderen van resources. Stel dat u een aantal test-VM's moet inrichten voor verschillende toepassingsteams binnen verschillende resourcegroepbereiken. In dit geval kan een implementatiestack worden gebruikt om deze testomgevingen te maken en de configuraties van de test-VM bij te werken via volgende updates voor de implementatiestack. Nadat het project is voltooid, kan het nodig zijn om resources te verwijderen die zijn gemaakt, zoals de test-VM's. Door gebruik te maken van een implementatiestack, kunnen de beheerde resources eenvoudig worden verwijderd door de juiste verwijdervlag op te geven. Deze gestroomlijnde benadering bespaart tijd tijdens het opschonen van de omgeving, omdat er één update voor de stackresource nodig is in plaats van elke test-VM afzonderlijk te wijzigen of te verwijderen in verschillende resourcegroepbereiken.
Voor implementatiestacks is Azure PowerShell versie 12.0.0 of hoger of Azure CLI versie 2.61.0 of hoger vereist.
Als u uw eerste implementatiestack wilt maken, voert u de quickstart uit: een implementatiestack maken.
Waarom implementatiestacks gebruiken?
Implementatiestacks bieden de volgende voordelen:
- Gestroomlijnde inrichting en beheer van resources binnen verschillende bereiken als een uniforme entiteit.
- Voorkomen van ongewenste wijzigingen in beheerde resources via instellingen voor weigeren.
- Efficiënt opschonen van omgevingen met behulp van verwijdervlagmen tijdens implementatiestackupdates.
- Gebruik van standaardsjablonen zoals Bicep, ARM-sjablonen of sjabloonspecificaties voor uw implementatiestacks.
Bekende beperkingen
- Impliciet gemaakte resources worden niet beheerd door de implementatiestack. Daarom is er geen weigeringstoewijzingen of opschoning mogelijk.
- Weigeringstoewijzingen bieden geen ondersteuning voor tags.
- Weigeringstoewijzingen worden niet ondersteund in het bereik van de beheergroep. Ze worden echter ondersteund in een beheergroepstack als de implementatie is gericht op het abonnementsbereik.
- Implementatiestacks kunnen Key Vault-geheimen niet verwijderen. Als u sleutelkluisgeheimen uit een sjabloon verwijdert, moet u ook de opdracht update/delete van de implementatiestack uitvoeren met de loskoppelmodus.
Bekende problemen
- Als u resourcegroepen verwijdert, worden weigeringstoewijzingen momenteel overgeslagen. Wanneer u een implementatiestack maakt in het bereik van de resourcegroep, bevat het Bicep-bestand niet de definitie voor de resourcegroep. Ondanks de instelling voor weigeringstoewijzing is het mogelijk om de resourcegroep en de bijbehorende ingesloten stack te verwijderen. Als een vergrendeling echter actief is voor een resource in de groep, mislukt de verwijderbewerking.
- De What-if-ondersteuning is nog niet beschikbaar.
- Een beheergroep-scoped stack kan niet worden geïmplementeerd in een andere beheergroep. Het kan alleen worden geïmplementeerd in de beheergroep van de stack zelf of in een onderliggend abonnement.
- De PowerShell-opdracht help bevat een
DeleteResourcesAndResourcesGroups
waarde voor deActionOnUnmanage
switch. Wanneer deze waarde wordt gebruikt, worden met de opdracht de beheerde resources en de resourcegroepen losgekoppeld. Deze waarde wordt verwijderd in de volgende update. Gebruik deze waarde niet. - In sommige gevallen kunnen de cmdlets Nieuwe en Set-cmdlets van Azure PowerShell een algemene sjabloonvalidatiefout retourneren die niet duidelijk kan worden uitgevoerd. Deze fout wordt opgelost in de volgende release, maar als de fout onduidelijk is, kunt u de cmdlet uitvoeren in de foutopsporingsmodus om een gedetailleerdere fout in het onbewerkte antwoord te zien.
- Implementatiestacks worden niet ondersteund door de Microsoft Graph-provider.
Ingebouwde rollen
Waarschuwing
Afdwingen van de RBAC-machtiging Microsoft.Resources/deploymentStacks/manageDenySetting/action wordt geïmplementeerd in verschillende regio's, waaronder Government Clouds.
Er zijn twee ingebouwde rollen voor de implementatiestack:
- Inzender voor Azure Deployment Stack: hiermee kunnen gebruikers implementatiestacks beheren, maar kunnen geen weigeringstoewijzingen binnen de implementatiestacks maken of verwijderen.
- Eigenaar van Azure Deployment Stack: hiermee kunnen gebruikers implementatiestacks beheren, inclusief gebruikers met weigeringstoewijzingen.
Implementatiestacks maken
Een implementatiestackresource kan worden gemaakt op het bereik van de resourcegroep, het abonnement of de beheergroep. De sjabloon die wordt doorgegeven aan een implementatiestack definieert de resources die moeten worden gemaakt of bijgewerkt op het doelbereik dat is opgegeven voor de sjabloonimplementatie.
- Een stack binnen het bereik van de resourcegroep kan de sjabloon implementeren die is doorgegeven aan hetzelfde bereik van de resourcegroep waar de implementatiestack bestaat.
- Een stack op abonnementsbereik kan de sjabloon implementeren die is doorgegeven aan een resourcegroepbereik (indien opgegeven) of hetzelfde abonnementsbereik waar de implementatiestack bestaat.
- Een stack op het bereik van de beheergroep kan de sjabloon implementeren die is doorgegeven aan het opgegeven abonnementsbereik.
Het is belangrijk om te weten dat waar een implementatiestack bestaat, dus de weigeringstoewijzing die is gemaakt met de mogelijkheid voor weigeren-instellingen. Als u bijvoorbeeld een implementatiestack maakt op abonnementsbereik waarmee de sjabloon wordt geïmplementeerd in het bereik van de resourcegroep en de modus DenyDelete
Instellingen weigeren, kunt u eenvoudig beheerde resources inrichten in de opgegeven resourcegroep en verwijderingspogingen naar deze resources blokkeren. Door deze methode te gebruiken, verbetert u ook de beveiliging van de implementatiestack door deze te scheiden op abonnementsniveau, in plaats van op het niveau van de resourcegroep. Deze scheiding zorgt ervoor dat de ontwikkelaarsteams die met de ingerichte resources werken alleen zichtbaarheid en schrijftoegang tot de resourcegroepen hebben, terwijl de implementatiestack op een hoger niveau geïsoleerd blijft. Dit minimaliseert het aantal gebruikers dat een implementatiestack kan bewerken en wijzigingen kan aanbrengen in de weigeringstoewijzing. Zie Beheerde resource beveiligen tegen verwijdering voor meer informatie.
De opdrachten voor create-stack kunnen ook worden gebruikt om implementatiestacks bij te werken.
Een implementatiestack maken op het bereik van de resourcegroep:
New-AzResourceGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ResourceGroupName "<resource-group-name>" `
-TemplateFile "<bicep-file-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
Een implementatiestack maken in het abonnementsbereik:
New-AzSubscriptionDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-DeploymentResourceGroupName "<resource-group-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
De DeploymentResourceGroupName
parameter geeft de resourcegroep op die wordt gebruikt voor het opslaan van de beheerde resources. Als de parameter niet is opgegeven, worden de beheerde resources opgeslagen in het abonnementsbereik.
Een implementatiestack maken op het bereik van de beheergroep:
New-AzManagementGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-DeploymentSubscriptionId "<subscription-id>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
De deploymentSubscriptionId
parameter geeft het abonnement op dat wordt gebruikt voor het opslaan van de beheerde resources. Als de parameter niet is opgegeven, worden de beheerde resources opgeslagen in het bereik van de beheergroep.
Implementatiestacks vermelden
Resources voor implementatiestacks weergeven op het bereik van de resourcegroep:
Get-AzResourceGroupDeploymentStack `
-ResourceGroupName "<resource-group-name>"
Resources voor implementatiestacks weergeven op het abonnementsbereik:
Get-AzSubscriptionDeploymentStack
Resources voor implementatiestacks weergeven op het bereik van de beheergroep:
Get-AzManagementGroupDeploymentStack `
-ManagementGroupId "<management-group-id>"
Implementatiestacks bijwerken
Als u een implementatiestack wilt bijwerken, waarbij mogelijk een beheerde resource moet worden toegevoegd of verwijderd, moet u wijzigingen aanbrengen in de onderliggende Bicep-bestanden. Zodra de wijzigingen zijn aangebracht, hebt u twee opties om de implementatiestack bij te werken: voer de updateopdracht uit of voer de opdracht create opnieuw uit.
De lijst met beheerde resources kan volledig worden beheerd via het ontwerppatroon infrastructuur als code (IaC).
De opdracht Instellen gebruiken
Een implementatiestack bijwerken op het bereik van de resourcegroep:
Set-AzResourceGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ResourceGroupName "<resource-group-name>" `
-TemplateFile "<bicep-file-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
Een implementatiestack bijwerken op het abonnementsbereik:
Set-AzSubscriptionDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-DeploymentResourceGroupName "<resource-group-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
De DeploymentResourceGroupName
parameter geeft de resourcegroep op die wordt gebruikt voor het opslaan van de implementatiestackresources. Als u geen naam voor een resourcegroep opgeeft, maakt de implementatiestackservice een nieuwe resourcegroep voor u.
Een implementatiestack bijwerken op het bereik van de beheergroep:
Set-AzManagementGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-DeploymentSubscriptionId "<subscription-id>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "none"
De opdracht Nieuw gebruiken
U krijgt een waarschuwing die lijkt op de volgende:
The deployment stack 'myStack' you're trying to create already exists in the current subscription/management group/resource group. Do you want to overwrite it? Detaching: resources, resourceGroups (Y/N)
Zie Implementatiestacks maken voor meer informatie.
Loskoppelen en verwijderen van besturingselementen
Een losgekoppelde resource (of onbeheerde resource) verwijst naar een resource die niet wordt bijgehouden of beheerd door de implementatiestack, maar nog steeds in Azure bestaat.
Als u Azure wilt instrueren om onbeheerde resources te verwijderen, werkt u de stack bij met de opdracht Stack maken met de volgende schakeloptie. Zie Implementatiestack maken voor meer informatie.
Gebruik de ActionOnUnmanage
schakeloptie om te definiëren wat er gebeurt met resources die niet meer worden beheerd nadat een stack is bijgewerkt of verwijderd. Toegestane waarden zijn:
deleteAll
: verwijder in plaats van loskoppelen voor beheerde resources en resourcegroepen.deleteResources
: gebruik verwijderen in plaats van alleen loskoppelen voor beheerde resources.detachAll
: koppel de beheerde resources en resourcegroepen los.
Voorbeeld:
New-AzSubscriptionDeploymentStack `
-Name "<deployment-stack-name" `
-TemplateFile "<bicep-file-name>" `
-DenySettingsMode "none" `
-ActionOnUnmanage "deleteAll"
Waarschuwing
Wanneer u resourcegroepen verwijdert waarvoor de actie-on-beheerswitch is ingesteld DeleteAll
, worden ook de beheerde resourcegroepen en alle resources erin verwijderd.
De stack-out-of-sync-fout verwerken
Wanneer u een implementatiestack bijwerkt of verwijdert, kan de volgende stack-out-of-sync-fout optreden, waarmee wordt aangegeven dat de lijst met stackresources niet juist is gesynchroniseerd.
The deployment stack '{0}' may not have an accurate list of managed resources. To ensure no resources are accidentally deleted, please check that the managed resource list does not have any additional values. If there is any uncertainty, we recommend redeploying the stack with the same template and parameters as the current iteration. To bypass this warning, please specify the 'BypassStackOutOfSyncError' flag.
U kunt een lijst met de resources ophalen uit De Azure-portal of het momenteel geïmplementeerde Bicep-bestand opnieuw implementeren met dezelfde parameters. De uitvoer toont de beheerde resources
...
Resources: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/demoRg/providers/Microsoft.Network/virtualNetworks/vnetthmimleef5fwk
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/demoRg/providers/Microsoft.Storage/storageAccounts/storethmimleef5fwk
Nadat u de lijst met resources in de stack hebt gecontroleerd en gecontroleerd, kunt u de opdracht opnieuw uitvoeren met de BypassStackOutOfSyncError
switch in Azure PowerShell (of bypass-stack-out-of-sync-error
in Azure CLI). Deze switch moet alleen worden gebruikt nadat u de lijst met resources in de stack grondig hebt bekeken voordat u de opdracht opnieuw uitvoert. Deze schakeloptie mag nooit standaard worden gebruikt.
Implementatiestacks verwijderen
De ActionOnUnmanage
schakeloptie definieert de actie voor de resources die niet meer worden beheerd. De schakeloptie heeft de volgende waarden:
DeleteAll
: Verwijder zowel de resources als de resourcegroepen.DeleteResources
: Verwijder alleen de resources.DetachAll
: Koppel de resources los.
Zelfs als u de switch voor verwijderen opgeeft, kunnen onbeheerde resources in de resourcegroep waarin de implementatiestack zich bevindt, voorkomen dat zowel de niet-beheerde resources als de resourcegroep zelf worden verwijderd.
Resources voor implementatiestacks verwijderen binnen het bereik van de resourcegroep:
Remove-AzResourceGroupDeploymentStack `
-name "<deployment-stack-name>" `
-ResourceGroupName "<resource-group-name>" `
-ActionOnUnmanage "<deleteAll/deleteResources/detachAll>"
Resources voor implementatiestacks verwijderen in het abonnementsbereik:
Remove-AzSubscriptionDeploymentStack `
-Name "<deployment-stack-name>" `
-ActionOnUnmanage "<deleteAll/deleteResources/detachAll>"
Resources voor implementatiestacks verwijderen binnen het bereik van de beheergroep:
Remove-AzManagementGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ManagementGroupId "<management-group-id>" `
-ActionOnUnmanage "<deleteAll/deleteResources/detachAll>"
Beheerde resources weergeven in implementatiestack
De implementatiestackservice heeft nog geen grafische gebruikersinterface (GUI) van Azure Portal. Als u de beheerde resources in een implementatiestack wilt weergeven, gebruikt u de volgende Azure Powershell-/Azure CLI-opdrachten:
Beheerde resources weergeven op het bereik van de resourcegroep:
(Get-AzResourceGroupDeploymentStack -Name "<deployment-stack-name>" -ResourceGroupName "<resource-group-name>").Resources
Beheerde resources weergeven op het abonnementsbereik:
(Get-AzSubscriptionDeploymentStack -Name "<deployment-stack-name>").Resources
Beheerde resources weergeven op het bereik van de beheergroep:
(Get-AzManagementGroupDeploymentStack -Name "<deployment-stack-name>" -ManagementGroupId "<management-group-id>").Resources
Resources toevoegen aan implementatiestack
Als u een beheerde resource wilt toevoegen, voegt u de resourcedefinitie toe aan de onderliggende Bicep-bestanden en voert u vervolgens de updateopdracht uit of voert u de opdracht maken opnieuw uit. Zie Update-implementatiestacks voor meer informatie.
Beheerde resources verwijderen uit de implementatiestack
Als u een beheerde resource wilt verwijderen, verwijdert u de resourcedefinitie uit de onderliggende Bicep-bestanden en voert u vervolgens de updateopdracht uit of voert u de opdracht maken opnieuw uit. Zie Update-implementatiestacks voor meer informatie.
Beheerde resources beveiligen
U kunt specifieke machtigingen toewijzen aan de beheerde resources van een implementatiestack om te voorkomen dat onbevoegde beveiligingsprinciplen deze verwijderen of bijwerken. Deze machtigingen worden instellingen voor weigeren genoemd. U wilt stacks opslaan op het bovenliggende bereik. Als u bijvoorbeeld resources in een abonnement wilt beveiligen, moet u de stack op het bovenliggende bereik plaatsen. Dit is de directe bovenliggende beheergroep.
De instelling weigeren is alleen van toepassing op de besturingsvlakbewerkingen, niet op de bewerkingen van het gegevensvlak. Opslagaccounts en sleutelkluizen worden bijvoorbeeld gemaakt via het besturingsvlak, zodat ze kunnen worden beheerd door een implementatiestack. Onderliggende resources, zoals geheimen of blobcontainers, die worden gemaakt via het gegevensvlak, kunnen echter niet worden beheerd door een implementatiestack.
De instelling voor weigeren is alleen van toepassing op expliciet gemaakte resources, niet impliciet gemaakte resources. Een beheerd AKS-cluster maakt bijvoorbeeld meerdere andere services om dit te ondersteunen, zoals een virtuele machine. Omdat de virtuele machine in dit geval niet is gedefinieerd in het Bicep-bestand en een impliciet gemaakte resource is, is deze niet onderhevig aan de instellingen voor weigeren van de implementatiestack.
Notitie
Voor de nieuwste release zijn specifieke machtigingen voor het stack-bereik vereist om het volgende te kunnen doen:
- Een implementatiestack maken of bijwerken en instelling voor weigeren configureren op een andere waarde dan
None
. - Een implementatiestack bijwerken of verwijderen met een bestaande instelling voor weigeren van een andere waarde dan
None
.
Gebruik de ingebouwde rollen van de implementatiestack om machtigingen te verlenen.
De Azure PowerShell bevat deze parameters om de weigeringstoewijzing aan te passen:
DenySettingsMode
: Definieert de bewerkingen die niet zijn toegestaan voor de beheerde resources om te beschermen tegen onbevoegde beveiligingsprinciplen die proberen ze te verwijderen of bij te werken. Deze beperking geldt voor iedereen, tenzij expliciet toegang wordt verleend. De waarden zijn:None
,DenyDelete
enDenyWriteAndDelete
.DenySettingsApplyToChildScopes
: Wanneer dit is opgegeven, is de configuratie van de instellingsmodus weigeren ook van toepassing op het onderliggende bereik van de beheerde resources. Een Bicep-bestand definieert bijvoorbeeld een Microsoft.Sql/servers-resource (bovenliggend) en een Microsoft.Sql/servers/databases-resource (onderliggend). Als er een implementatiestack wordt gemaakt met behulp van het Bicep-bestand waarvoor deDenySettingsApplyToChildScopes
instelling is ingeschakeld en deDenySettingsMode
instelling is ingeschakeldDenyWriteAndDelete
, kunt u geen extra onderliggende resources toevoegen aan de resource Microsoft.Sql/servers of de resource Microsoft.Sql/servers/databases .DenySettingsExcludedAction
: Lijst met beheerbewerkingen op basis van rollen die zijn uitgesloten van de instellingen voor weigeren. Maximaal 200 acties zijn toegestaan.DenySettingsExcludedPrincipal
: Lijst met Microsoft Entra-principal-id's die zijn uitgesloten van de vergrendeling. Maximaal vijf principals zijn toegestaan.
Instellingen voor weigeren toepassen op het bereik van de resourcegroep:
New-AzResourceGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ResourceGroupName "<resource-group-name>" `
-TemplateFile "<bicep-file-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "denyDelete" `
-DenySettingsExcludedAction "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
-DenySettingsExcludedPrincipal "<object-id>,<object-id>"
De instellingen voor weigeren toepassen op het abonnementsbereik:
New-AzSubscriptionDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "denyDelete" `
-DenySettingsExcludedAction "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
-DenySettingsExcludedPrincipal "<object-id>,<object-id>"
Gebruik de DeploymentResourceGroupName
parameter om de naam van de resourcegroep op te geven waarop de implementatiestack wordt gemaakt. Als een bereik niet is opgegeven, wordt het bereik van de implementatiestack gebruikt.
Instellingen voor weigeren toepassen op het bereik van de beheergroep:
New-AzManagementGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-Location "<location>" `
-TemplateFile "<bicep-file-name>" `
-ActionOnUnmanage "detachAll" `
-DenySettingsMode "denyDelete" `
-DenySettingsExcludedActions "Microsoft.Compute/virtualMachines/write Microsoft.StorageAccounts/delete" `
-DenySettingsExcludedPrincipal "<object-id>,<object-id>"
Gebruik de DeploymentSubscriptionId
parameter om de abonnements-id op te geven waarop de implementatiestack wordt gemaakt. Als een bereik niet is opgegeven, wordt het bereik van de implementatiestack gebruikt.
Beheerde resources loskoppelen van implementatiestack
Standaard worden implementatiestacks losgekoppeld en worden onbeheerde resources niet verwijderd wanneer ze zich niet meer in het beheerbereik van de stack bevinden. Zie Update-implementatiestacks voor meer informatie.
Sjablonen exporteren uit implementatiestacks
U kunt de resources exporteren van een implementatiestack naar een JSON-uitvoer. U kunt de uitvoer doorsluisen naar een bestand.
Een implementatiestack exporteren op het bereik van de resourcegroep:
Save-AzResourceGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ResourceGroupName "<resource-group-name>" `
Een implementatiestack exporteren binnen het abonnementsbereik:
Save-AzSubscriptionDeploymentStack `
-name "<deployment-stack-name>"
Een implementatiestack exporteren op het bereik van de beheergroep:
Save-AzManagementGroupDeploymentStack `
-Name "<deployment-stack-name>" `
-ManagementGroupId "<management-group-id>"
Volgende stappen
Als u een quickstart wilt doorlopen, raadpleegt u quickstart: een implementatiestack maken.