상세 컨텐츠

본문 제목

[API/Javascript] 카카오 클라우드 Instance API

API

by develop-Jay 2026. 3. 22. 22:09

본문

이번엔 카카오 클라우드의 인스턴스 생성/조회/활성화에 대한 API를 다뤄볼려고 한다.

 

인스턴스를 사용하기 위해서는 여러 종류가 필요해서, 이번엔 좀 공간을 분리할 예정이다.

 


기본설정 -Token (header에 넣어서 전송)

const getAuthToken = async () => {
    const url = 'https://iam.kakaocloud.com/identity/v3/auth/tokens'
    const payload = {
      auth: {
        identity: {
            methods: ['application_credential'],
            application_credential: {
                id: iam.accessKey,
                secret: iam.secretKey
            }
        }
      }
    };
    
        const response = await axios.post(url, payload, {
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        },
        timeout: 10000
    });

    const token = response.headers['x-subject-token'];
    return token;
};

1. 인스턴스

 

아래의 코드는 인스턴스 생성에 대한 로직이다.

const  createInstance = async (instanceConfig) => {
    const {
        instanceName,
        imageId,
        subnetId,
        keyName,
        securityGroupName,
        flavorId,
        volumeTypeId,
        availabilityZone,
        volumeSize
    } = instanceConfig;


    const name = instanceName;
    const url = `https://bcs.kr-central-2.kakaocloud.com/api/v1/instances`;
    
    const payload = {
        instance: {
            name,
            description: description,
            count: 1,
            image_id: imageId,
            flavor_id: flavorId,
            availability_zone: availabilityZone,
            subnets: [{ id: subnetId }],
            volumes: [{
                is_delete_on_termination: true,
                size: volumeSize,
                source_type: 'image',
                uuid: imageId,
                type_id: volumeTypeId || undefined
            }],
            key_name: keyName,
            security_groups: groupName,
            is_disable_hyper_threading: false
            }
    };
    
    const response = await axios.post(url, payload, { timeout: 30000 });
    return true;
};

 

객체안에 instance안에 객체로 데이터를 넣어서 전송해야된다.

처음에 instance안에 안넣었다가 에러가 났다.

 

image_id는 카카오 클라우드에 미리 등록하는 이미지 파일이고, flavor_id는 인스턴스 유형, CPU, RAM의 크기와 관련된 유형의 ID값이다.

subnet의 경우에도 미리 등록된 subnet_id, volumes의 size는 인스턴스의 용량이다.

count의 경우 한번에 생성할 인스턴스 개수이다.

 

 

다음엔 인스턴스 삭제이다.

const deleteInstance = async (instanceId) => {
    const url = `https://bcs.kr-central-2.kakaocloud.com/api/v1/instances/${instanceId}`;
        await axios.delete(url, { timeout: 30000 });
        return true;
};

삭제의 경우 Token과 instance_Id만 있으면 인스턴스를 바로 삭제가 가능하다.

 

 

인스턴스 상세 조회의 경우에도  Token과 instance_Id만 있으면 인스턴스를 조회할 수있다. 사용한 config 들과 현재 활성화 상태에 대해서 알수있다.

const getInstanceDetail = async (instanceId) => {
    const url = `https://bcs.kr-central-2.kakaocloud.com/api/v1/instances/${instanceId}`;
    const response = await axios.get(url);
    const instance = response.data?.instance;  
    return response.data?.instance;
};

 

 

인스턴스의 상태에 대한 변경이다.

const instanceStatus = ['start', 'stop', 'shelve', 'unshelve','soft-reboot'];

const changeInstanceState = async (instanceId, action, actionLabel) => {
    const url = `https://bcs.kr-central-2.kakaocloud.com/api/v1/instances/${instanceId}/${action}`;

    try {
        const response = await axios.post(url, {}, {
            timeout: 30000,
            validateStatus: (status) => status < 500
        });


        return { instanceId, action, message: `인스턴스 ${actionLabel} 요청 수락됨` };
    } catch (error) {
        fail(500, `INSTANCE_${action.toUpperCase()}_FAILED`, { detail: error.message });
    }
};

instanceStatus에 대한 인스턴스의 설정이 가능하고, shelve 상태는 stop은 아니지만 인스턴스 보류이다.

 

 

현재 계정에 가지고 있는 인스턴스 목록 조회이다.

const listInstances = async () => {
    const url = `https://bcs.kr-central-2.kakaocloud.com/api/v1/instances`;
    const response = await axios.get(url);
    return response.data?.instances || [];
};

 

 

 


2. 인스턴스 유형(flavor)

인스턴스 유형의 경우에는 사용자가 생성하는 것은 아니라서 목록 조회나 상세 정보 조회 정도의 api가 제공된다.

 

아래의 api는 유형 전체 조회이다.

const flavorsList = async (params) => {
    const url = `https://bcs.kr-central-2.kakaocloud.com/api/v1/flavors`;
    const response = await axios.get(url, { params });
    const flavors = response.data?.flavors || [];
    return flavors;
};

 

상세히 알고 싶으면,  아래와 같이 알고 싶은 flavor의 id를 넣으면 된다.

const getFlavorDetail = async (flavorId) => {
    const url = `https://bcs.kr-central-2.kakaocloud.com/api/v1/flavors/${flavorId}`;
    const response = await axios.get(url);
    const flavor = response.data?.flavor;
    return flavor;

};

3. public IP

처음에 인스턴스를 생성만 하게 될 경우, private IP만 존재한다. Public으로 연결하고 싶은 경우, 따로 등록을 해줘야된다.

 

따로 만들어서 생성할수도 있지만, 좀 더 간단하게 새로운 publicIP를 바로 인스턴스에 연결하는 API를 사용할려고 한다.

인스턴스의 IP와 인스턴스를 생성하면 기본적으로 연결되는 network_interface_id가 존재한다.

인스턴스 상세 조회를 하면 알수있고, 상세의 data.instance.addresses[0].network_interface_id 의 위치에 있다.

const associateNewPublicIp = async (instance_id, network_interface_id) => {
    const url = `https://bcs.kr-central-2.kakaocloud.com/api/v1/instances/${instance_id}/network-interfaces/${network_interface_id}/public-ips`;
    const response = await axios.post(url, {timeout:30000});
    return response.data.public_ip;
}

 

 

삭제의 경우와 같은 방식으로 publicIp를 인스턴스에서 분리하면서 삭제할수 있다.

params에 is_delete를 넣지 않거나 false로 할 경우, 삭제는 되지 않고 연결만 해제가 된다.

const removePublicIp = async (instance_id, network_interface_id) => {
    const url = `https://bcs.kr-central-2.kakaocloud.com/api/v1/instances/${instance_id}/network-interfaces/${network_interface_id}/public-ips`;

    const response = await axios.delete(url, {
        params: {
            is_delete: true,
        }
    }, {timeout:30000});
    return response
}

 

 

이상으로 카카오 클라우드 인스턴스에 대한 간단한 정리를 하였다.

관련글 더보기