1. Packages
  2. MongoDB Atlas
  3. API Docs
  4. getX509AuthenticationDatabaseUser
MongoDB Atlas v3.18.0 published on Thursday, Sep 12, 2024 by Pulumi

mongodbatlas.getX509AuthenticationDatabaseUser

Explore with Pulumi AI

mongodbatlas logo
MongoDB Atlas v3.18.0 published on Thursday, Sep 12, 2024 by Pulumi

    # Data Source: mongodbatlas.X509AuthenticationDatabaseUser

    mongodbatlas.X509AuthenticationDatabaseUser describes a X509 Authentication Database User. This represents a X509 Authentication Database User.

    NOTE: Groups and projects are synonymous terms. You may find group_id in the official documentation.

    Example Usage

    S

    Example Usage: Generate an Atlas-managed X.509 certificate for a MongoDB user

    Coming soon!
    
    Coming soon!
    
    Coming soon!
    
    Coming soon!
    
    Coming soon!
    
    resources:
      user:
        type: mongodbatlas:DatabaseUser
        properties:
          projectId: <PROJECT-ID>
          username: myUsername
          x509Type: MANAGED
          databaseName: $external
          roles:
            - roleName: atlasAdmin
              databaseName: admin
          labels:
            - key: My Key
              value: My Value
      testX509AuthenticationDatabaseUser:
        type: mongodbatlas:X509AuthenticationDatabaseUser
        name: test
        properties:
          projectId: ${user.projectId}
          username: ${user.username}
          monthsUntilExpiration: 2
    variables:
      test:
        fn::invoke:
          Function: mongodbatlas:getX509AuthenticationDatabaseUser
          Arguments:
            projectId: ${testX509AuthenticationDatabaseUser.projectId}
            username: ${testX509AuthenticationDatabaseUser.username}
    

    Example Usage: Save a customer-managed X.509 configuration for an Atlas project

    import * as pulumi from "@pulumi/pulumi";
    import * as mongodbatlas from "@pulumi/mongodbatlas";
    
    const testX509AuthenticationDatabaseUser = new mongodbatlas.X509AuthenticationDatabaseUser("test", {
        projectId: "<PROJECT-ID>",
        customerX509Cas: `-----BEGIN CERTIFICATE-----
    MIICmTCCAgICCQDZnHzklxsT9TANBgkqhkiG9w0BAQsFADCBkDELMAkGA1UEBhMC
    VVMxDjAMBgNVBAgMBVRleGFzMQ8wDQYDVQQHDAZBdXN0aW4xETAPBgNVBAoMCHRl
    c3QuY29tMQ0wCwYDVQQLDARUZXN0MREwDwYDVQQDDAh0ZXN0LmNvbTErMCkGCSqG
    SIb3DQEJARYcbWVsaXNzYS5wbHVua2V0dEBtb25nb2RiLmNvbTAeFw0yMDAyMDQy
    MDQ2MDFaFw0yMTAyMDMyMDQ2MDFaMIGQMQswCQYDVQQGEwJVUzEOMAwGA1UECAwF
    VGV4YXMxDzANBgNVBAcMBkF1c3RpbjERMA8GA1UECgwIdGVzdC5jb20xDTALBgNV
    BAsMBFRlc3QxETAPBgNVBAMMCHRlc3QuY29tMSswKQYJKoZIhvcNAQkBFhxtZWxp
    c3NhLnBsdW5rZXR0QG1vbmdvZGIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
    iQKBgQCf1LRqr1zftzdYx2Aj9G76tb0noMPtj6faGLlPji1+m6Rn7RWD9L0ntWAr
    cURxvypa9jZ9MXFzDtLevvd3tHEmfrUT3ukNDX6+Jtc4kWm+Dh2A70Pd+deKZ2/O
    Fh8audEKAESGXnTbeJCeQa1XKlIkjqQHBNwES5h1b9vJtFoLJwIDAQABMA0GCSqG
    SIb3DQEBCwUAA4GBADMUncjEPV/MiZUcVNGmktP6BPmEqMXQWUDpdGW2+Tg2JtUA
    7MMILtepBkFzLO+GlpZxeAlXO0wxiNgEmCRONgh4+t2w3e7a8GFijYQ99FHrAC5A
    iul59bdl18gVqXia1Yeq/iK7Ohfy/Jwd7Hsm530elwkM/ZEkYDjBlZSXYdyz
    -----END CERTIFICATE-----"
    `,
    });
    const test = mongodbatlas.getX509AuthenticationDatabaseUserOutput({
        projectId: testX509AuthenticationDatabaseUser.projectId,
    });
    
    import pulumi
    import pulumi_mongodbatlas as mongodbatlas
    
    test_x509_authentication_database_user = mongodbatlas.X509AuthenticationDatabaseUser("test",
        project_id="<PROJECT-ID>",
        customer_x509_cas="""-----BEGIN CERTIFICATE-----
    MIICmTCCAgICCQDZnHzklxsT9TANBgkqhkiG9w0BAQsFADCBkDELMAkGA1UEBhMC
    VVMxDjAMBgNVBAgMBVRleGFzMQ8wDQYDVQQHDAZBdXN0aW4xETAPBgNVBAoMCHRl
    c3QuY29tMQ0wCwYDVQQLDARUZXN0MREwDwYDVQQDDAh0ZXN0LmNvbTErMCkGCSqG
    SIb3DQEJARYcbWVsaXNzYS5wbHVua2V0dEBtb25nb2RiLmNvbTAeFw0yMDAyMDQy
    MDQ2MDFaFw0yMTAyMDMyMDQ2MDFaMIGQMQswCQYDVQQGEwJVUzEOMAwGA1UECAwF
    VGV4YXMxDzANBgNVBAcMBkF1c3RpbjERMA8GA1UECgwIdGVzdC5jb20xDTALBgNV
    BAsMBFRlc3QxETAPBgNVBAMMCHRlc3QuY29tMSswKQYJKoZIhvcNAQkBFhxtZWxp
    c3NhLnBsdW5rZXR0QG1vbmdvZGIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
    iQKBgQCf1LRqr1zftzdYx2Aj9G76tb0noMPtj6faGLlPji1+m6Rn7RWD9L0ntWAr
    cURxvypa9jZ9MXFzDtLevvd3tHEmfrUT3ukNDX6+Jtc4kWm+Dh2A70Pd+deKZ2/O
    Fh8audEKAESGXnTbeJCeQa1XKlIkjqQHBNwES5h1b9vJtFoLJwIDAQABMA0GCSqG
    SIb3DQEBCwUAA4GBADMUncjEPV/MiZUcVNGmktP6BPmEqMXQWUDpdGW2+Tg2JtUA
    7MMILtepBkFzLO+GlpZxeAlXO0wxiNgEmCRONgh4+t2w3e7a8GFijYQ99FHrAC5A
    iul59bdl18gVqXia1Yeq/iK7Ohfy/Jwd7Hsm530elwkM/ZEkYDjBlZSXYdyz
    -----END CERTIFICATE-----"
    """)
    test = mongodbatlas.get_x509_authentication_database_user_output(project_id=test_x509_authentication_database_user.project_id)
    
    package main
    
    import (
    	"github.com/pulumi/pulumi-mongodbatlas/sdk/v3/go/mongodbatlas"
    	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
    )
    
    func main() {
    	pulumi.Run(func(ctx *pulumi.Context) error {
    		testX509AuthenticationDatabaseUser, err := mongodbatlas.NewX509AuthenticationDatabaseUser(ctx, "test", &mongodbatlas.X509AuthenticationDatabaseUserArgs{
    			ProjectId: pulumi.String("<PROJECT-ID>"),
    			CustomerX509Cas: pulumi.String(`-----BEGIN CERTIFICATE-----
    MIICmTCCAgICCQDZnHzklxsT9TANBgkqhkiG9w0BAQsFADCBkDELMAkGA1UEBhMC
    VVMxDjAMBgNVBAgMBVRleGFzMQ8wDQYDVQQHDAZBdXN0aW4xETAPBgNVBAoMCHRl
    c3QuY29tMQ0wCwYDVQQLDARUZXN0MREwDwYDVQQDDAh0ZXN0LmNvbTErMCkGCSqG
    SIb3DQEJARYcbWVsaXNzYS5wbHVua2V0dEBtb25nb2RiLmNvbTAeFw0yMDAyMDQy
    MDQ2MDFaFw0yMTAyMDMyMDQ2MDFaMIGQMQswCQYDVQQGEwJVUzEOMAwGA1UECAwF
    VGV4YXMxDzANBgNVBAcMBkF1c3RpbjERMA8GA1UECgwIdGVzdC5jb20xDTALBgNV
    BAsMBFRlc3QxETAPBgNVBAMMCHRlc3QuY29tMSswKQYJKoZIhvcNAQkBFhxtZWxp
    c3NhLnBsdW5rZXR0QG1vbmdvZGIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
    iQKBgQCf1LRqr1zftzdYx2Aj9G76tb0noMPtj6faGLlPji1+m6Rn7RWD9L0ntWAr
    cURxvypa9jZ9MXFzDtLevvd3tHEmfrUT3ukNDX6+Jtc4kWm+Dh2A70Pd+deKZ2/O
    Fh8audEKAESGXnTbeJCeQa1XKlIkjqQHBNwES5h1b9vJtFoLJwIDAQABMA0GCSqG
    SIb3DQEBCwUAA4GBADMUncjEPV/MiZUcVNGmktP6BPmEqMXQWUDpdGW2+Tg2JtUA
    7MMILtepBkFzLO+GlpZxeAlXO0wxiNgEmCRONgh4+t2w3e7a8GFijYQ99FHrAC5A
    iul59bdl18gVqXia1Yeq/iK7Ohfy/Jwd7Hsm530elwkM/ZEkYDjBlZSXYdyz
    -----END CERTIFICATE-----"
    `),
    		})
    		if err != nil {
    			return err
    		}
    		_ = mongodbatlas.LookupX509AuthenticationDatabaseUserOutput(ctx, mongodbatlas.GetX509AuthenticationDatabaseUserOutputArgs{
    			ProjectId: testX509AuthenticationDatabaseUser.ProjectId,
    		}, nil)
    		return nil
    	})
    }
    
    using System.Collections.Generic;
    using System.Linq;
    using Pulumi;
    using Mongodbatlas = Pulumi.Mongodbatlas;
    
    return await Deployment.RunAsync(() => 
    {
        var testX509AuthenticationDatabaseUser = new Mongodbatlas.X509AuthenticationDatabaseUser("test", new()
        {
            ProjectId = "<PROJECT-ID>",
            CustomerX509Cas = @"-----BEGIN CERTIFICATE-----
    MIICmTCCAgICCQDZnHzklxsT9TANBgkqhkiG9w0BAQsFADCBkDELMAkGA1UEBhMC
    VVMxDjAMBgNVBAgMBVRleGFzMQ8wDQYDVQQHDAZBdXN0aW4xETAPBgNVBAoMCHRl
    c3QuY29tMQ0wCwYDVQQLDARUZXN0MREwDwYDVQQDDAh0ZXN0LmNvbTErMCkGCSqG
    SIb3DQEJARYcbWVsaXNzYS5wbHVua2V0dEBtb25nb2RiLmNvbTAeFw0yMDAyMDQy
    MDQ2MDFaFw0yMTAyMDMyMDQ2MDFaMIGQMQswCQYDVQQGEwJVUzEOMAwGA1UECAwF
    VGV4YXMxDzANBgNVBAcMBkF1c3RpbjERMA8GA1UECgwIdGVzdC5jb20xDTALBgNV
    BAsMBFRlc3QxETAPBgNVBAMMCHRlc3QuY29tMSswKQYJKoZIhvcNAQkBFhxtZWxp
    c3NhLnBsdW5rZXR0QG1vbmdvZGIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
    iQKBgQCf1LRqr1zftzdYx2Aj9G76tb0noMPtj6faGLlPji1+m6Rn7RWD9L0ntWAr
    cURxvypa9jZ9MXFzDtLevvd3tHEmfrUT3ukNDX6+Jtc4kWm+Dh2A70Pd+deKZ2/O
    Fh8audEKAESGXnTbeJCeQa1XKlIkjqQHBNwES5h1b9vJtFoLJwIDAQABMA0GCSqG
    SIb3DQEBCwUAA4GBADMUncjEPV/MiZUcVNGmktP6BPmEqMXQWUDpdGW2+Tg2JtUA
    7MMILtepBkFzLO+GlpZxeAlXO0wxiNgEmCRONgh4+t2w3e7a8GFijYQ99FHrAC5A
    iul59bdl18gVqXia1Yeq/iK7Ohfy/Jwd7Hsm530elwkM/ZEkYDjBlZSXYdyz
    -----END CERTIFICATE-----""
    ",
        });
    
        var test = Mongodbatlas.GetX509AuthenticationDatabaseUser.Invoke(new()
        {
            ProjectId = testX509AuthenticationDatabaseUser.ProjectId,
        });
    
    });
    
    package generated_program;
    
    import com.pulumi.Context;
    import com.pulumi.Pulumi;
    import com.pulumi.core.Output;
    import com.pulumi.mongodbatlas.X509AuthenticationDatabaseUser;
    import com.pulumi.mongodbatlas.X509AuthenticationDatabaseUserArgs;
    import com.pulumi.mongodbatlas.MongodbatlasFunctions;
    import com.pulumi.mongodbatlas.inputs.GetX509AuthenticationDatabaseUserArgs;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Map;
    import java.io.File;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    
    public class App {
        public static void main(String[] args) {
            Pulumi.run(App::stack);
        }
    
        public static void stack(Context ctx) {
            var testX509AuthenticationDatabaseUser = new X509AuthenticationDatabaseUser("testX509AuthenticationDatabaseUser", X509AuthenticationDatabaseUserArgs.builder()
                .projectId("<PROJECT-ID>")
                .customerX509Cas("""
    -----BEGIN CERTIFICATE-----
    MIICmTCCAgICCQDZnHzklxsT9TANBgkqhkiG9w0BAQsFADCBkDELMAkGA1UEBhMC
    VVMxDjAMBgNVBAgMBVRleGFzMQ8wDQYDVQQHDAZBdXN0aW4xETAPBgNVBAoMCHRl
    c3QuY29tMQ0wCwYDVQQLDARUZXN0MREwDwYDVQQDDAh0ZXN0LmNvbTErMCkGCSqG
    SIb3DQEJARYcbWVsaXNzYS5wbHVua2V0dEBtb25nb2RiLmNvbTAeFw0yMDAyMDQy
    MDQ2MDFaFw0yMTAyMDMyMDQ2MDFaMIGQMQswCQYDVQQGEwJVUzEOMAwGA1UECAwF
    VGV4YXMxDzANBgNVBAcMBkF1c3RpbjERMA8GA1UECgwIdGVzdC5jb20xDTALBgNV
    BAsMBFRlc3QxETAPBgNVBAMMCHRlc3QuY29tMSswKQYJKoZIhvcNAQkBFhxtZWxp
    c3NhLnBsdW5rZXR0QG1vbmdvZGIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
    iQKBgQCf1LRqr1zftzdYx2Aj9G76tb0noMPtj6faGLlPji1+m6Rn7RWD9L0ntWAr
    cURxvypa9jZ9MXFzDtLevvd3tHEmfrUT3ukNDX6+Jtc4kWm+Dh2A70Pd+deKZ2/O
    Fh8audEKAESGXnTbeJCeQa1XKlIkjqQHBNwES5h1b9vJtFoLJwIDAQABMA0GCSqG
    SIb3DQEBCwUAA4GBADMUncjEPV/MiZUcVNGmktP6BPmEqMXQWUDpdGW2+Tg2JtUA
    7MMILtepBkFzLO+GlpZxeAlXO0wxiNgEmCRONgh4+t2w3e7a8GFijYQ99FHrAC5A
    iul59bdl18gVqXia1Yeq/iK7Ohfy/Jwd7Hsm530elwkM/ZEkYDjBlZSXYdyz
    -----END CERTIFICATE-----"
                """)
                .build());
    
            final var test = MongodbatlasFunctions.getX509AuthenticationDatabaseUser(GetX509AuthenticationDatabaseUserArgs.builder()
                .projectId(testX509AuthenticationDatabaseUser.projectId())
                .build());
    
        }
    }
    
    resources:
      testX509AuthenticationDatabaseUser:
        type: mongodbatlas:X509AuthenticationDatabaseUser
        name: test
        properties:
          projectId: <PROJECT-ID>
          customerX509Cas: |
            -----BEGIN CERTIFICATE-----
            MIICmTCCAgICCQDZnHzklxsT9TANBgkqhkiG9w0BAQsFADCBkDELMAkGA1UEBhMC
            VVMxDjAMBgNVBAgMBVRleGFzMQ8wDQYDVQQHDAZBdXN0aW4xETAPBgNVBAoMCHRl
            c3QuY29tMQ0wCwYDVQQLDARUZXN0MREwDwYDVQQDDAh0ZXN0LmNvbTErMCkGCSqG
            SIb3DQEJARYcbWVsaXNzYS5wbHVua2V0dEBtb25nb2RiLmNvbTAeFw0yMDAyMDQy
            MDQ2MDFaFw0yMTAyMDMyMDQ2MDFaMIGQMQswCQYDVQQGEwJVUzEOMAwGA1UECAwF
            VGV4YXMxDzANBgNVBAcMBkF1c3RpbjERMA8GA1UECgwIdGVzdC5jb20xDTALBgNV
            BAsMBFRlc3QxETAPBgNVBAMMCHRlc3QuY29tMSswKQYJKoZIhvcNAQkBFhxtZWxp
            c3NhLnBsdW5rZXR0QG1vbmdvZGIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
            iQKBgQCf1LRqr1zftzdYx2Aj9G76tb0noMPtj6faGLlPji1+m6Rn7RWD9L0ntWAr
            cURxvypa9jZ9MXFzDtLevvd3tHEmfrUT3ukNDX6+Jtc4kWm+Dh2A70Pd+deKZ2/O
            Fh8audEKAESGXnTbeJCeQa1XKlIkjqQHBNwES5h1b9vJtFoLJwIDAQABMA0GCSqG
            SIb3DQEBCwUAA4GBADMUncjEPV/MiZUcVNGmktP6BPmEqMXQWUDpdGW2+Tg2JtUA
            7MMILtepBkFzLO+GlpZxeAlXO0wxiNgEmCRONgh4+t2w3e7a8GFijYQ99FHrAC5A
            iul59bdl18gVqXia1Yeq/iK7Ohfy/Jwd7Hsm530elwkM/ZEkYDjBlZSXYdyz
            -----END CERTIFICATE-----"        
    variables:
      test:
        fn::invoke:
          Function: mongodbatlas:getX509AuthenticationDatabaseUser
          Arguments:
            projectId: ${testX509AuthenticationDatabaseUser.projectId}
    

    Using getX509AuthenticationDatabaseUser

    Two invocation forms are available. The direct form accepts plain arguments and either blocks until the result value is available, or returns a Promise-wrapped result. The output form accepts Input-wrapped arguments and returns an Output-wrapped result.

    function getX509AuthenticationDatabaseUser(args: GetX509AuthenticationDatabaseUserArgs, opts?: InvokeOptions): Promise<GetX509AuthenticationDatabaseUserResult>
    function getX509AuthenticationDatabaseUserOutput(args: GetX509AuthenticationDatabaseUserOutputArgs, opts?: InvokeOptions): Output<GetX509AuthenticationDatabaseUserResult>
    def get_x509_authentication_database_user(project_id: Optional[str] = None,
                                              username: Optional[str] = None,
                                              opts: Optional[InvokeOptions] = None) -> GetX509AuthenticationDatabaseUserResult
    def get_x509_authentication_database_user_output(project_id: Optional[pulumi.Input[str]] = None,
                                              username: Optional[pulumi.Input[str]] = None,
                                              opts: Optional[InvokeOptions] = None) -> Output[GetX509AuthenticationDatabaseUserResult]
    func LookupX509AuthenticationDatabaseUser(ctx *Context, args *LookupX509AuthenticationDatabaseUserArgs, opts ...InvokeOption) (*LookupX509AuthenticationDatabaseUserResult, error)
    func LookupX509AuthenticationDatabaseUserOutput(ctx *Context, args *LookupX509AuthenticationDatabaseUserOutputArgs, opts ...InvokeOption) LookupX509AuthenticationDatabaseUserResultOutput

    > Note: This function is named LookupX509AuthenticationDatabaseUser in the Go SDK.

    public static class GetX509AuthenticationDatabaseUser 
    {
        public static Task<GetX509AuthenticationDatabaseUserResult> InvokeAsync(GetX509AuthenticationDatabaseUserArgs args, InvokeOptions? opts = null)
        public static Output<GetX509AuthenticationDatabaseUserResult> Invoke(GetX509AuthenticationDatabaseUserInvokeArgs args, InvokeOptions? opts = null)
    }
    public static CompletableFuture<GetX509AuthenticationDatabaseUserResult> getX509AuthenticationDatabaseUser(GetX509AuthenticationDatabaseUserArgs args, InvokeOptions options)
    // Output-based functions aren't available in Java yet
    
    fn::invoke:
      function: mongodbatlas:index/getX509AuthenticationDatabaseUser:getX509AuthenticationDatabaseUser
      arguments:
        # arguments dictionary

    The following arguments are supported:

    ProjectId string
    Identifier for the Atlas project associated with the X.509 configuration.
    Username string
    Username of the database user to create a certificate for.
    ProjectId string
    Identifier for the Atlas project associated with the X.509 configuration.
    Username string
    Username of the database user to create a certificate for.
    projectId String
    Identifier for the Atlas project associated with the X.509 configuration.
    username String
    Username of the database user to create a certificate for.
    projectId string
    Identifier for the Atlas project associated with the X.509 configuration.
    username string
    Username of the database user to create a certificate for.
    project_id str
    Identifier for the Atlas project associated with the X.509 configuration.
    username str
    Username of the database user to create a certificate for.
    projectId String
    Identifier for the Atlas project associated with the X.509 configuration.
    username String
    Username of the database user to create a certificate for.

    getX509AuthenticationDatabaseUser Result

    The following output properties are available:

    Certificates List<GetX509AuthenticationDatabaseUserCertificate>
    Array of objects where each details one unexpired database user certificate.
    CustomerX509Cas string
    Id string
    The provider-assigned unique ID for this managed resource.
    ProjectId string
    Username string
    Certificates []GetX509AuthenticationDatabaseUserCertificate
    Array of objects where each details one unexpired database user certificate.
    CustomerX509Cas string
    Id string
    The provider-assigned unique ID for this managed resource.
    ProjectId string
    Username string
    certificates List<GetX509AuthenticationDatabaseUserCertificate>
    Array of objects where each details one unexpired database user certificate.
    customerX509Cas String
    id String
    The provider-assigned unique ID for this managed resource.
    projectId String
    username String
    certificates GetX509AuthenticationDatabaseUserCertificate[]
    Array of objects where each details one unexpired database user certificate.
    customerX509Cas string
    id string
    The provider-assigned unique ID for this managed resource.
    projectId string
    username string
    certificates Sequence[GetX509AuthenticationDatabaseUserCertificate]
    Array of objects where each details one unexpired database user certificate.
    customer_x509_cas str
    id str
    The provider-assigned unique ID for this managed resource.
    project_id str
    username str
    certificates List<Property Map>
    Array of objects where each details one unexpired database user certificate.
    customerX509Cas String
    id String
    The provider-assigned unique ID for this managed resource.
    projectId String
    username String

    Supporting Types

    GetX509AuthenticationDatabaseUserCertificate

    CreatedAt string
    GroupId string
    Id int
    NotAfter string
    Subject string
    CreatedAt string
    GroupId string
    Id int
    NotAfter string
    Subject string
    createdAt String
    groupId String
    id Integer
    notAfter String
    subject String
    createdAt string
    groupId string
    id number
    notAfter string
    subject string
    createdAt String
    groupId String
    id Number
    notAfter String
    subject String

    Package Details

    Repository
    MongoDB Atlas pulumi/pulumi-mongodbatlas
    License
    Apache-2.0
    Notes
    This Pulumi package is based on the mongodbatlas Terraform Provider.
    mongodbatlas logo
    MongoDB Atlas v3.18.0 published on Thursday, Sep 12, 2024 by Pulumi