用户数据的 Base64 编码脚本(AWS SDK for Java API)

Base64 encode script for user data (AWS SDK for Java API)

如何将 bash 脚本文件中的内容转换为 base64 编码的字符串,以便与亚马逊的 Java API 一起使用?此代码表达了我正在尝试执行的操作但导致异常:

...原因:com.amazonaws.AmazonServiceException:用户数据的 BASE64 编码无效(服务:AmazonEC2;状态代码:400;错误代码:InvalidParameterValue...

String startupUserData = "#!/bin/bash cd /home/ubuntu/myTestDir; mvn test -PmyBuild";

startupUserData = org.apache.commons.codec.binary.Base64.encodeBase64String(startupUserData.getBytes());

runRqst.withImageId(_computerAmi)
        .withInstanceType(instanceSize)
        .withMinCount(hwRequest.numHwComputers)
        // .withMaxCount(Utils.MAX_EC2_INSTANCES_AT_A_TIME) // NOT THIS
        .withMaxCount(hwRequest.numHwComputers)
        .withKeyName(_keyName)
        .withSecurityGroups(_securityGroup)
        .withUserData(startupUserData);
ec2.runInstances(runRqst);

编辑: com.amazonaws.util.Base64.encodeAsString() 平息异常但脚本仍然不执行。字符串应该如何格式化?要不要有马车returns?

对于编码,您需要使用亚马逊提供的编码class。

amazon.webservices.common.Encoding

它包含 API EncodeBase64(),您 returns 对数据进行了编码。

public static String EncodeBase64(byte[] rawData) {
 return Base64.encodeBytes(rawData);
}

com.amazonaws.util.Base64.encodeAsString 适合我。我使用 \n 来分隔多行。您也可以在 /var/lib/cloud/instance/user-data.txt 验证它相同 http://169.254.169.254/user-data returns.

使用上面的答案时遇到问题。我的解决方案是我导入了

import com.amazonaws.util.Base64;

然后

String initScript = "sudo -i apt-get install docker.io";

RunInstancesRequest run_request = new RunInstancesRequest()
                .withImageId(ami_id)
                .withInstanceType(InstanceType.T2Micro)
                .withMaxCount(1)
                .withMinCount(1)
                .withUserData(Base64.encodeAsString(initScript.getBytes()));