이번엔 카카오 클라우드의 인스턴스 생성/조회/활성화에 대한 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
}
이상으로 카카오 클라우드 인스턴스에 대한 간단한 정리를 하였다.