本文主要是介绍使用AWS SDK for Java创建并启动EC2实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文主要记录使用AWS SDK for Java创建并启动EC2实例的过程及遇到的问题和解决办法。
1.初始化EC2
AWS的身份验证方式有两种:一种是通过获取默认路径下的credentials文件,该文件通常在"\Users\****\.aws"下;另一种是直接将密钥(ACCESS_KEY,SECRET_KEY)作为参数。两种方法本质上其实是相同的。具体实现如下:
①方式一:
public void init() {try {AWSCredentials credentials = new ProfileCredentialsProvider("default").getCredentials();EC2 = new AmazonEC2Client(credentials);EC2.setRegion(Region.getRegion(Regions.CN_NORTH_1));}catch(Exception e) {log.error("init EC2",e);}
}
②方式二:
public void init_with_key(String ACCESS_KEY, String SECRET_KEY) { try { AWSCredentials credentials = null; credentials = new BasicAWSCredentials(ACCESS_KEY,SECRET_KEY); EC2 = new AmazonEC2Client(credentials); EC2.setRegion(Region.getRegion(Regions.CN_NORTH_1)); }catch(Exception e) { log.error("init EC2", e); }
}
*注意:要设置区域(setRegion),不然会出错!
2.创建并启动EC2实例
在启动实例之前,需要对EC2的相关属性进行设置,如下所示:
·withImageId
AMI的ID。
·withInstanceType
与指定的AMI兼容的实例类型。
·withMinCount
待启动的EC2实例的最小数量。如果此数量大于目标可用区中可以启动的实例数,则EC2不会启动任何实例。
·withMaxCount
待启动的EC2实例的最大数量。如果此数量大于目标可用区中可以启动的实例数,则EC2会启动MinCount之上最大数量的实例。可以启动的实例数介于1和允许为该实例类型启动的最大实例数之间。
·withKeyName
EC2密钥对的名称。如果在未指定密钥对的情况下启动实例,将无法连接到该实例。
·withSecurityGroups
一个或多个安全组。
·withUserData
设置用户数据。
可以将以上属性通过键值对的形式作为参数进行设置。具体实现如下:
①设置属性:
Map<String,String> config = new HashMap<String,String>();
config.put("ImageId", "ami-4b814f22");
config.put("InstanceType", "m1.small");
config.put("MinCount", "1");
config.put("MaxCount", "1");
config.put("KeyName", "my-key-pair");
config.put("SecurityGroups", "my-security-group");
config.put("UserData", "script");
*说明:以上设置需要根据实际的需求进行修改,这里只是示例。
②启动实例:
public void runInstance(Map<String,String> config) {try {RunInstancesRequest runInstancesRequest = new RunInstancesRequest();//设置EC2实例的属性runInstancesRequest.withImageId(config.get("ImageId")) //AMI ID.withInstanceType(config.get("InstanceType")) //实例类型.withMinCount(Integer.parseInt(config.get("MinCount"))) //最少启动实例数.withMaxCount(Integer.parseInt(config.get("MaxCount"))) //最多启动实例数.withKeyName(config.get("KeyName")) //密钥名称.withSecurityGroups(config.get("SecurityGroups")) //安全组.withUserData(config.get("UserData")); //用户数据RunInstancesResult result = EC2.runInstances(runInstancesRequest);System.out.println(result);}catch(Exception e){log.error("run instance",e);}
}
3.注意问题
在上述实现过程中,需要注意的一个问题就是用户数据必须采用base64编码。否则,实例会创建失败。因此需要对用户数据进行base64编码处理后,再调用"withUserData"进行设置。
说明:用户数据是在开虚拟机时由用户提供的,最常用来让自动化的脚本(script)可以很方便、简单地完成工作。具体可参考:http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/WindowsGuide/ec2-instance-metadata.html#instancedata-add-user-data
Java8之后,在java.util中增加了Base64,用来处理base64的编码与解码。具体实现如下:
①base64编码:
public String getEncode(String str) {final Base64.Encoder encode = Base64.getEncoder();final byte[] bytes = str.getBytes();final String encodeStr = encode.encodeToString(bytes);return encodeStr;
}
②base64解码:
public String getDecode(String encodeText) {final Base64.Decoder decode = Base64.getDecoder();final String decodeStr = decode.decode(encodeText).toString();return decodeStr;
}
以上即本文的全部内容,错误之处欢迎大家交流指正:)。
这篇关于使用AWS SDK for Java创建并启动EC2实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!