我已经成功地使用以下代码提供了裸机云计算实例:
public static Instance createInstance(
ComputeClient computeClient,
String compartmentId,
AvailabilityDomain availabilityDomain,
String instanceName,
Image image,
Shape shape,
Subnet subnet
) {
LaunchInstanceResponse response = computeClient.launchInstance(
LaunchInstanceRequest.builder()
.launchInstanceDetails(
LaunchInstanceDetails.builder()
.availabilityDomain(availabilityDomain.getName())
.compartmentId(compartmentId)
.displayName(instanceName)
.imageId(image.getId())
.shape(shape.getShape())
.subnetId(subnet.getId())
.build())
.build());
return response.getInstance();
}
但是,我无法通过上述代码创建的任何实例,因为launchInstance
上没有参数可以传递我的SSH Keypair的公钥。
如何告诉实例什么SSH公共密钥允许?我知道必须以某种方式有可能,因为控制台UI允许我提供SSH公钥作为实例创建的一部分。
根据启动实例API文档,您需要通过metadata
参数的ssh_authorized_keys
字段传递SSH公共密钥:
提供云 - 内部元数据
您可以使用以下元数据密钥名称将信息提供给云端:
" ssh_authorized_keys" - 提供一个或多个公共SSH键 包含在用于默认用户的〜/.ssh/eleteriped_keys文件中 实例。使用newline字符分开多个键。这 SSH键必须处于授权_keys文件所需的格式
Java SDK中的代码如下:
public static Instance createInstance(
ComputeClient computeClient,
String compartmentId,
AvailabilityDomain availabilityDomain,
String instanceName,
Image image,
Shape shape,
Subnet subnet
) {
String sshPublicKey = "ssh-rsa AAAAB3NzaC1y...key shortened for example...fdK/ABqxgH7sy3AWgBjfj some description";
Map<String, String> metadata = new HashMap<>();
metadata.put("ssh_authorized_keys", sshPublicKey);
LaunchInstanceResponse response = computeClient.launchInstance(
LaunchInstanceRequest.builder()
.launchInstanceDetails(
LaunchInstanceDetails.builder()
.availabilityDomain(availabilityDomain.getName())
.compartmentId(compartmentId)
.displayName(instanceName)
.imageId(image.getId())
.metadata(metadata)
.shape(shape.getShape())
.subnetId(subnet.getId())
.build())
.build());
return response.getInstance();
}
然后,该实例将允许您使用该公共密钥的SSH Keypair进行SSH。