feat: MSK, MSK CONNECT and SES
This commit is contained in:
@@ -15,6 +15,31 @@ import {ec2Service} from '../services/ec2'
|
||||
type Ec2Service = typeof ec2Service
|
||||
type CreateKeyPairInput = {name: string; keyType?: Ec2KeyPairType}
|
||||
|
||||
type Ec2DiagnosticResponse = {ec2?: {instances?: Array<{
|
||||
instanceId?: string
|
||||
sshHost?: string
|
||||
sshPort?: number
|
||||
containerId?: string
|
||||
containerStatus?: 'running' | 'stopped' | 'unavailable'
|
||||
}>}}
|
||||
|
||||
async function connectionDetails(instanceId: string) {
|
||||
const endpoint = process.env.FLOCI_ENDPOINT
|
||||
if (!endpoint) {
|
||||
return undefined
|
||||
}
|
||||
try {
|
||||
const response = await fetch(`${endpoint}/_floci/diagnose`)
|
||||
if (!response.ok) {
|
||||
return undefined
|
||||
}
|
||||
return (await response.json() as Ec2DiagnosticResponse).ec2?.instances
|
||||
?.find((instance) => instance.instanceId === instanceId)
|
||||
} catch {
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
|
||||
function isEc2KeyPairType(value: unknown): value is Ec2KeyPairType {
|
||||
return value === 'rsa' || value === 'ed25519'
|
||||
}
|
||||
@@ -33,7 +58,9 @@ export function createEc2Router(svc: Ec2Service = ec2Service) {
|
||||
})
|
||||
|
||||
app.get('/instances/:instanceId', async (c) => {
|
||||
return c.json(await svc.describeInstance(c.req.param('instanceId')))
|
||||
const instanceId = c.req.param('instanceId')
|
||||
const [instance, connection] = await Promise.all([svc.describeInstance(instanceId), connectionDetails(instanceId)])
|
||||
return c.json({...instance, connection})
|
||||
})
|
||||
|
||||
app.post('/instances', async (c) => {
|
||||
@@ -91,6 +118,19 @@ export function createEc2Router(svc: Ec2Service = ec2Service) {
|
||||
}
|
||||
})
|
||||
|
||||
app.put('/instances/:instanceId/security-groups', async (c) => {
|
||||
try {
|
||||
const {groupIds} = await c.req.json<{groupIds: string[]}>()
|
||||
if (!Array.isArray(groupIds) || groupIds.length === 0 || groupIds.some((groupId) => !groupId)) {
|
||||
return c.json({error: 'At least one security group is required'}, 400)
|
||||
}
|
||||
await svc.updateInstanceSecurityGroups(c.req.param('instanceId'), groupIds)
|
||||
return c.json({ok: true})
|
||||
} catch (error) {
|
||||
return handleError(c, error)
|
||||
}
|
||||
})
|
||||
|
||||
app.post('/instances/:instanceId/image', async (c) => {
|
||||
try {
|
||||
const body = await c.req.json<Omit<CreateAmiInput, 'instanceId'>>()
|
||||
|
||||
Reference in New Issue
Block a user