prehistoric-egg-84122
08/11/2025, 5:43 AMComponentResourcediagnosticresOpFailedEventsummary or cancelCommandErrorcontinueOnErrorsummarycontinueOnErrorcancel()errorprehistoric-egg-84122
08/11/2025, 5:45 AM{
  "sequence": 57,
  "timestamp": 1754891003,
  "diagnosticEvent": {
    "urn": "urn:pulumi:aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::ECSTemplateV1$aws:iam/role:Role::ecs-task-role",
    "prefix": "error: ",
    "message": "  sdk-v2/provider2.go:572: sdk.helper_schema: creating IAM Role (kidol-zz-service-dev): operation error IAM: CreateRole, https response error StatusCode: 409, RequestID: de501574-7a9e-4daa-b3c3-35681de74a51, EntityAlreadyExists: Role with name kidol-zz-service-dev already exists.: provider=aws@6.83.0\n\n",
    "color": "never",
    "severity": "error"
  }
}
{
  "sequence": 58,
  "timestamp": 1754891003,
  "diagnosticEvent": {
    "urn": "urn:pulumi:aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::ECSTemplateV1$aws:iam/role:Role::ecs-task-role",
    "prefix": "error: ",
    "message": "1 error occurred:\n\t* creating IAM Role (kidol-zz-service-dev): operation error IAM: CreateRole, https response error StatusCode: 409, RequestID: de501574-7a9e-4daa-b3c3-35681de74a51, EntityAlreadyExists: Role with name kidol-zz-service-dev already exists.\n\n\n",
    "color": "never",
    "severity": "error"
  }
}
{
  "sequence": 59,
  "timestamp": 1754891003,
  "resOpFailedEvent": {
    "metadata": {
      "op": "create",
      "urn": "urn:pulumi:aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::ECSTemplateV1$aws:iam/role:Role::ecs-task-role",
      "type": "aws:iam/role:Role",
      "old": null,
      "new": {
        "type": "aws:iam/role:Role",
        "urn": "urn:pulumi:aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::ECSTemplateV1$aws:iam/role:Role::ecs-task-role",
        "custom": true,
        "id": "",
        "parent": "urn:pulumi:aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::ECSTemplateV1::kint5-kidol-zz-service-dev",
        "inputs": {
          "__defaults": [
            "forceDetachPolicies",
            "maxSessionDuration",
            "path"
          ],
          "assumeRolePolicy": "{\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"ecs-tasks.amazonaws.com\"}}],\"Version\":\"2012-10-17\"}",
          "forceDetachPolicies": false,
          "inlinePolicies": [],
          "maxSessionDuration": 3600,
          "name": "kidol-zz-service-dev",
          "path": "/"
        },
        "outputs": {},
        "provider": "urn:pulumi:aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::ECSTemplateV1$pulumi:providers:aws::provider::b93e3cde-5d9a-4db3-94b1-b9c64cbb1f56"
      },
      "detailedDiff": null,
      "logical": true,
      "provider": "urn:pulumi:aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service::ECSTemplateV1$pulumi:providers:aws::provider::b93e3cde-5d9a-4db3-94b1-b9c64cbb1f56"
    },
    "status": 0,
    "steps": 3
  }
}
{
  "sequence": 60,
  "timestamp": 1754891003,
  "diagnosticEvent": {
    "prefix": "error: ",
    "message": "update failed\n",
    "color": "never",
    "severity": "error"
  }
}
{
  "sequence": 61,
  "timestamp": 1754891003,
  "diagnosticEvent": {
    "prefix": "debug: ",
    "message": "RegisterResource RPC finished: resource:ecs-task-role[aws:iam/role:Role]; err: Error: Resource monitor is terminating, resp: undefined\n",
    "color": "never",
    "severity": "debug"
  }
}
... never end@Injectable()
export class PulumiService implements IProvisioner {
  private readonly PULUMI_RUNTIME = 'nodejs';
  private readonly logger = new Logger(PulumiService.name);
  constructor(
    private readonly configService: ConfigService,
    private readonly pulumiEventService: PulumiEventService,
    private readonly pulumiProgramService: PulumiProgramService,
  ) {}
  async create(command: ProvisioningCommand) {
    await this.executeProvisioning(ProvisioningActionType.CREATE, command);
  }
  async update(command: ProvisioningCommand) {
    await this.executeProvisioning(ProvisioningActionType.UPDATE, command);
  }
  async delete(command: ProvisioningCommand) {
    await this.executeProvisioning(ProvisioningActionType.DELETE, command);
  }
  async preview(command: ProvisioningCommand) {
    await this.executeProvisioning(ProvisioningActionType.PREVIEW, command);
  }
  private async executeProvisioning(
    actionType: ProvisioningActionType,
    command: ProvisioningCommand,
  ) {
    const pulumiStack = await this.createPulumiStack(actionType, command);
    await this.executePulumiOperation(actionType, command, pulumiStack);
  }
  private async createPulumiStack(
    actionType: ProvisioningActionType,
    command: ProvisioningCommand,
  ): Promise<Stack> {
    const pulumiStackName = this.createPulumiStackName(
      command.resourceMetadata,
    );
    const pulumiProjectName = this.createPulumiProjectName(
      command.resourceMetadata,
    );
    const pulumiProgram = this.pulumiProgramService.createPulumiProgram(
      actionType,
      command.resourceMetadata,
      command.resourceConfig,
    );
    return await LocalWorkspace.createOrSelectStack(
      {
        stackName: pulumiStackName,
        projectName: pulumiProjectName,
        program: pulumiProgram,
      },
      {
        projectSettings: {
          name: pulumiProjectName,
          runtime: this.PULUMI_RUNTIME,
          backend: {
            url: this.createPulumiBackendUrl(command.resourceMetadata),
          },
        },
        envVars: {
          PULUMI_CONFIG_PASSPHRASE: this.configService.get<string>(
            'PULUMI_CONFIG_PASSPHRASE',
            'dev-passphrase',
          ),
        },
      },
    );
  }
  private async executePulumiOperation(
    actionType: ProvisioningActionType,
    command: ProvisioningCommand,
    stack: Stack,
  ): Promise<void> {
    const pulumiOnEventHandler =
      this.pulumiEventService.createPulumiEventHandler(
        command.jobId,
        command.correlatedEventId,
      );
    const pulumiExecutionOptions = {
      refresh: true,
      onEvent: pulumiOnEventHandler,
    };
    switch (actionType) {
      case ProvisioningActionType.CREATE:
        await this.executeStackWithBackendLockRetry(stack, () => stack.up(pulumiExecutionOptions));
        return;
      case ProvisioningActionType.UPDATE:
        await this.executeStackWithBackendLockRetry(stack, () => stack.up(pulumiExecutionOptions));
        return;
      case ProvisioningActionType.DELETE:
        await this.executeStackWithBackendLockRetry(stack, () => stack.destroy(pulumiExecutionOptions));
        return;
      case ProvisioningActionType.PREVIEW:
        await this.executeStackWithBackendLockRetry(stack, () =>
          stack.preview({ ...pulumiExecutionOptions, diff: true }),
        );
        return;
      default:
        throw new Error(`Invalid action type for Pulumi: ${actionType}`);
    }
  }
  private createPulumiStackName(resourceMetadata: ResourceMetadata): string {
    return PulumiUtil.createPulumiIdentifier(resourceMetadata, '-');
  }
  private createPulumiProjectName(resourceMetadata: ResourceMetadata): string {
    return PulumiUtil.createPulumiIdentifier(resourceMetadata, '-');
  }
  private createPulumiBackendUrl(resourceMetadata: ResourceMetadata): string {
    const backendBucket = this.configService.get<string>(
      'PULUMI_BACKEND_BUCKET',
      'test-idp-dev-bucket',
    );
    const backendKey = PulumiUtil.createPulumiIdentifier(
      resourceMetadata,
      '/',
    );
    return `s3://${backendBucket}/${backendKey}`;
  }
  private async executeStackWithBackendLockRetry<T>(
    stack: Stack,
    operation: () => Promise<T>,
    retries = 1,
  ): Promise<T> {
    try {
      return await operation();
    } catch (error) {
      if (retries > 0 && error instanceof ConcurrentUpdateError) {
        this.logger.warn(`Pulumi stack ${stack.name}: backend lock detected. Trying cancel()...`);
        await stack.cancel();
        await new Promise(resolve => setTimeout(resolve, 3000));
        return this.executeStackWithBackendLockRetry(stack, operation, retries - 1);        
      }
      // todo : publish kafka error event
      await stack.cancel();
      throw error;
    }
  }
}prehistoric-egg-84122
08/11/2025, 5:53 AMIf one of those operations fails, you may have noticed that Pulumi takes the most conservative approach, letting already in-flight operations complete, but not starting any new operations. Most often, that's what you want β there might be no point in bringing up more infrastructure if a resource fails.prehistoric-egg-84122
08/11/2025, 12:34 PMonOutput: (out: string) => this.logger.debug(`[pulumi out] ${out}`),
onError: (err: string) => this.logger.error(`[pulumi err] ${err}`),[Nest] 72132  - 08/11/2025, 9:33:10 PM   DEBUG [PulumiService] [pulumi out] Updating (aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service):
[Nest] 72132  - 08/11/2025, 9:33:10 PM   DEBUG [PulumiService] [pulumi out] 
[Nest] 72132  - 08/11/2025, 9:33:10 PM   DEBUG [PulumiService] [pulumi out]  ~  pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service refreshing (0s) 
 ~  ECSTemplateV1 kint5-kidol-zz-service-dev refreshing (0s) 
[Nest] 72132  - 08/11/2025, 9:33:10 PM   DEBUG [PulumiService] [pulumi out]  ~  pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service refreshing (0s) 
 ~  ECSTemplateV1 kint5-kidol-zz-service-dev refresh (0.00s) 
[Nest] 72132  - 08/11/2025, 9:33:10 PM   DEBUG [PulumiService] [pulumi out]  ~  pulumi:providers:aws provider refreshing (0s) 
 ~  pulumi:providers:aws provider refresh (0.00s) 
[Nest] 72132  - 08/11/2025, 9:33:10 PM   DEBUG [PulumiService] [pulumi out]  ~  terraform:state:RemoteStateReference security refreshing (0s) 
[Nest] 72132  - 08/11/2025, 9:33:10 PM   DEBUG [PulumiService] [pulumi out]  ~  terraform:state:RemoteStateReference platforms refreshing (0s) 
 ~  terraform:state:RemoteStateReference network refreshing (0s) 
[Nest] 72132  - 08/11/2025, 9:33:11 PM   DEBUG [PulumiService] [pulumi out] @ updating....
[Nest] 72132  - 08/11/2025, 9:33:11 PM   DEBUG [PulumiService] [pulumi out] 
 ~  terraform:state:RemoteStateReference platforms refresh (0.85s) 
[Nest] 72132  - 08/11/2025, 9:33:11 PM   DEBUG [PulumiService] [pulumi out]  ~  terraform:state:RemoteStateReference network refresh (1s) 
[Nest] 72132  - 08/11/2025, 9:33:11 PM   DEBUG [PulumiService] [pulumi out]  ~  terraform:state:RemoteStateReference security refresh (1s) 
[Nest] 72132  - 08/11/2025, 9:33:11 PM   DEBUG [PulumiService] [pulumi out]     pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service running 
[Nest] 72132  - 08/11/2025, 9:33:11 PM   DEBUG [PulumiService] [pulumi out]     ECSTemplateV1 kint5-kidol-zz-service-dev  
[Nest] 72132  - 08/11/2025, 9:33:12 PM   DEBUG [PulumiService] [pulumi out] @ updating....
[Nest] 72132  - 08/11/2025, 9:33:13 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:13 PM   DEBUG [PulumiService] [pulumi out] 
    pulumi:providers:aws provider  
[Nest] 72132  - 08/11/2025, 9:33:13 PM   DEBUG [PulumiService] [pulumi out] 
    pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service running read terraform:state:RemoteStateReference security
    pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service running read terraform:state:RemoteStateReference network
[Nest] 72132  - 08/11/2025, 9:33:13 PM   DEBUG [PulumiService] [pulumi out]     pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service running read terraform:state:RemoteStateReference platforms
[Nest] 72132  - 08/11/2025, 9:33:13 PM   DEBUG [PulumiService] [pulumi out]  +  aws:iam:Role ecs-task-role creating (0s) 
[Nest] 72132  - 08/11/2025, 9:33:14 PM   DEBUG [PulumiService] [pulumi out]     pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service running read terraform:state:RemoteStateReference security
[Nest] 72132  - 08/11/2025, 9:33:14 PM   DEBUG [PulumiService] [pulumi out] @ updating....
[Nest] 72132  - 08/11/2025, 9:33:14 PM   DEBUG [PulumiService] [pulumi out] 
    pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service running read terraform:state:RemoteStateReference network
[Nest] 72132  - 08/11/2025, 9:33:14 PM   DEBUG [PulumiService] [pulumi out]     pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service running read terraform:state:RemoteStateReference platforms
[Nest] 72132  - 08/11/2025, 9:33:15 PM   DEBUG [PulumiService] [pulumi out]  +  aws:iam:Role ecs-task-role creating (1s) error:   sdk-v2/provider2.go:572: sdk.helper_schema: creating IAM Role (kidol-zz-service-dev): operation error IAM: CreateRole, https response error StatusCode: 409, RequestID: 876f22ba-3517-405f-aabc-2e8d20d43a36, EntityAlreadyExists: Role with name kidol-zz-service-dev already exists.: provider=aws@7.3.1
[Nest] 72132  - 08/11/2025, 9:33:15 PM   DEBUG [PulumiService] [pulumi out]  +  aws:iam:Role ecs-task-role creating (1s) error: 1 error occurred:
[Nest] 72132  - 08/11/2025, 9:33:15 PM   DEBUG [PulumiService] [pulumi out]  +  aws:iam:Role ecs-task-role **creating failed** error: 1 error occurred:
[Nest] 72132  - 08/11/2025, 9:33:15 PM   DEBUG [PulumiService] [pulumi out] @ updating....
[Nest] 72132  - 08/11/2025, 9:33:15 PM   DEBUG [PulumiService] [pulumi out] 
    pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service running error: update failed
[Nest] 72132  - 08/11/2025, 9:33:16 PM   DEBUG [PulumiService] [pulumi out] @ updating....
[Nest] 72132  - 08/11/2025, 9:33:17 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:18 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:19 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:20 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:21 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:22 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:23 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:24 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:25 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:26 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:27 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:28 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:29 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:30 PM   DEBUG [PulumiService] [pulumi out] .
[Nest] 72132  - 08/11/2025, 9:33:31 PM   DEBUG [PulumiService] [pulumi out] .
... endlessprehistoric-egg-84122
08/11/2025, 12:55 PM"@pulumi/aws": "^7.3.1",
    "@pulumi/pulumi": "^3.188.0",
    "@pulumi/terraform": "5.13.4",echoing-dinner-19531
08/11/2025, 2:45 PMprehistoric-egg-84122
08/11/2025, 4:44 PMEnter your passphrase to unlock config/secrets
Previewing update (dev):
     Type                        Name                        Plan       
 +   pulumi:pulumi:Stack         worker-ecs-test-dev         create     
 +   ββ ECSTemplateV1            kint5-kidol-zz-service-dev  create     
 +      ββ pulumi:providers:aws  provider                    create     
 +      ββ aws:iam:Role          ecs-task-role               create     
Resources:
    + 4 to create
Do you want to perform this update? yes
Updating (dev):
     Type                        Name                        Status                       Info
 +   pulumi:pulumi:Stack         worker-ecs-test-dev         **creating failed (3s)**     1 error
 +   ββ ECSTemplateV1            kint5-kidol-zz-service-dev  created (0.01s)              
 +      ββ pulumi:providers:aws  provider                    created (0.00s)              
 +      ββ aws:iam:Role          ecs-task-role               **creating failed**          2 errors
Diagnostics:
  pulumi:pulumi:Stack (worker-ecs-test-dev):
    error: update failed
  aws:iam:Role (ecs-task-role):
    error:   sdk-v2/provider2.go:572: sdk.helper_schema: creating IAM Role (kidol-zz-service-dev): operation error IAM: CreateRole, https response error StatusCode: 409, RequestID: 91bbf257-2923-4b60-87a2-377dd4522c6e, EntityAlreadyExists: Role with name kidol-zz-service-dev already exists.: provider=aws@7.3.1
    error: 1 error occurred:
        * creating IAM Role (kidol-zz-service-dev): operation error IAM: CreateRole, https response error StatusCode: 409, RequestID: 91bbf257-2923-4b60-87a2-377dd4522c6e, EntityAlreadyExists: Role with name kidol-zz-service-dev already exists.
Resources:
    + 3 created
Duration: 4s
a18144@18144ui-noteubug src %prehistoric-egg-84122
08/11/2025, 4:57 PMechoing-dinner-19531
08/11/2025, 4:58 PMechoing-dinner-19531
08/11/2025, 4:59 PMprehistoric-egg-84122
08/12/2025, 3:25 AM@Injectable()
export class PulumiProgramService {
  constructor() {}
  createPulumiProgram(): PulumiFn {
    ~~~~
    ~~~~
    // it works
    return async () => {
      new ECSTemplateV1(~~); // componentResource
    }
    // Stack hangs when there's an issue during operation
    // return async () =>
    //   new ECSTemplateV1(~~);
  }
}prehistoric-egg-84122
08/12/2025, 5:40 AMimport { LocalWorkspace, Stack } from '@pulumi/pulumi/automation/index.js';
import * as pulumi from '@pulumi/pulumi';
import * as aws from '@pulumi/aws';
class ECSTaskRoleComponent extends pulumi.ComponentResource {
  public taskRole: aws.iam.Role;
  public taskRolePolicy: aws.iam.RolePolicy;
  constructor(name: string, opts?: pulumi.ComponentResourceOptions) {
    super('custom:aws:ECSTaskRole', name, {}, opts);
    this.taskRole = new aws.iam.Role(`${name}-task-role`, {
      name: `${name}-task-role`,
      assumeRolePolicy: JSON.stringify({
        Version: '2012-10-17',
        Statement: [
          {
            Effect: 'Allow',
            Principal: {
              Service: '<http://ecs-tasks.amazonaws.com|ecs-tasks.amazonaws.com>',
            },
            Action: 'sts:AssumeRole',
          },
        ],
      }),
      tags: {
        Name: `${name}-task-role`,
        Environment: 'test',
      },
    }, { parent: this });
    this.taskRolePolicy = new aws.iam.RolePolicy(`${name}-task-role-policy`, {
      name: `${name}-task-role-policy`,
      role: this.taskRole.id,
      policy: JSON.stringify({
        Version: '2012-10-17',
        Statement: [
          {
            Effect: 'Allow',
            Action: [
              's3:GetObject',
              's3:PutObject',
              's3:DeleteObject',
              's3:ListBucket',
            ],
            Resource: [
              'arn:aws:s3:::test-bucket',
              'arn:aws:s3:::test-bucket/*',
            ],
          },
          {
            Effect: 'Allow',
            Action: [
              'logs:CreateLogGroup',
              'logs:CreateLogStream',
              'logs:PutLogEvents',
            ],
            Resource: '*',
          },
        ],
      }),
    }, { parent: this });
    this.registerOutputs({
      taskRoleArn: this.taskRole.arn,
      taskRoleName: this.taskRole.name,
      taskRolePolicyName: this.taskRolePolicy.name,
    });
  }
}
function createSimplePulumiProgram() {
  return async () => {
    const ecsTaskRole = new ECSTaskRoleComponent('kidol-zz-service');
    // μΆλ ₯
    return {
      taskRoleArn: ecsTaskRole.taskRole.arn,
      taskRoleName: ecsTaskRole.taskRole.name,
      taskRolePolicyName: ecsTaskRole.taskRolePolicy.name,
    };
  };
}
async function testPulumiAutomation() {
  
  const stackName = 'test~';
  const projectName = 'test~';
  const backendUrl = '<s3://test>~';
  
  let stack: Stack | undefined;
  
  try {
    console.log(`Creating stack: ${stackName}`);
    console.log(`Project name: ${projectName}`);
    console.log(`Backend URL: ${backendUrl}`);
    
    stack = await LocalWorkspace.createOrSelectStack(
      {
        stackName,
        projectName,
        program: createSimplePulumiProgram(),
      },
      {
        projectSettings: {
          name: projectName,
          runtime: 'nodejs',
          backend: {
            url: backendUrl,
          },
        },
        envVars: {
          PULUMI_CONFIG_PASSPHRASE: 'dev-passphrase',
        },
      },
    );
    console.log(`Stack created: ${stack.name}`);
    console.log('Starting stack up operation...');
    const upPromise = stack.up({
      refresh: true,
      showSecrets: true,
      onOutput: console.log,
    });
    await upPromise;
    console.log('Stack up completed successfully!');
  } catch (error) {
    console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
  }
}
testPulumiAutomation().catch((error) => {
  console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
  process.exit(1);
});node dist/index.js
Creating stack: ~~
Project name: ~~~
Backend URL: ~~~
Stack created: ~~~
Starting stack up operation...
Updating (aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service):
 ~  pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service refreshing (0s) 
 ~  custom:aws:ECSTaskRole kidol-zz-service refreshing (0s) 
 ~  custom:aws:ECSTaskRole kidol-zz-service refresh (0.00s) 
 ~  pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service refreshing (0s) 
    pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service running 
    custom:aws:ECSTaskRole kidol-zz-service  
@ updating....
.
 +  aws:iam:Role kidol-zz-service-task-role creating (0s) 
@ updating....
 +  aws:iam:Role kidol-zz-service-task-role creating (0s) error:   sdk-v2/provider2.go:572: sdk.helper_schema: creating IAM Role (kidol-zz-service-task-role): operation error IAM: CreateRole, https response error StatusCode: 409, RequestID: 9876e2e1-0133-4f77-88a8-8bae786deef8, EntityAlreadyExists: Role with name kidol-zz-service-task-role already exists.: provider=aws@7.3.1
 +  aws:iam:Role kidol-zz-service-task-role creating (0s) error: 1 error occurred:
 +  aws:iam:Role kidol-zz-service-task-role **creating failed** error: 1 error occurred:
    pulumi:pulumi:Stack aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service-aws-test-corp-kint5-ap-northeast-2-dev-ECS-kidol-zz-service running error: update failed
@ updating....
.
.
.
.
.
.prehistoric-egg-84122
08/12/2025, 5:58 AMprehistoric-egg-84122
08/12/2025, 6:33 AMechoing-dinner-19531
08/12/2025, 7:18 AMprehistoric-egg-84122
08/12/2025, 7:28 AMechoing-dinner-19531
08/12/2025, 7:30 AMprehistoric-egg-84122
08/12/2025, 8:36 AMex..
{
      await stack.refresh();
      await stack.up();
}