Skip to the content.

王孝东的个人空间

AWS 开发

获取Client,Client中已包括credential

package com.hpe.foxcloud.core.aws.util;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.auth.profile.internal.AwsProfileNameLoader;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder;
import com.hpe.foxcloud.core.aws.config.AwsClientConfigure;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * Created by wanxiaod on 9/13/2017.
 */
@Component
public class AwsClientUtil {

    @Autowired
    private AwsClientConfigure awsClientConfigure;

    @Value("${cloud.aws.region.static}")
    private String configureRegion;

    /**
     * 获取EC2的客户端:如果配置文件中配置了代理,则同时也为AmazonEC2客户端配置代理
     * @param region
     * @param awsAccessKeyId
     * @param awsSecretAccessKey
     * @return
     */
    public AmazonEC2 getAmazonEC2Client(String region, String awsAccessKeyId, String awsSecretAccessKey, String profile){
        AWSCredentialsProvider awsCredentialsProvider = getAwsCredentialsProvider(awsAccessKeyId, awsSecretAccessKey, profile);
        ClientConfiguration clientConfiguration = getClientConfiguration();

        // 如果没有传入region参数,则将region设置为配置的值(cloud.aws.region.static)
        if(StringUtils.isEmpty(region)){
            region = configureRegion;
        }

        AmazonEC2 amazonEC2Client = AmazonEC2ClientBuilder.standard().withCredentials(awsCredentialsProvider).withClientConfiguration(clientConfiguration).withRegion(region).build();

        return amazonEC2Client;
    }

    /**
     * 获取AWS EC2 Client,不带profile参数
     * @param region
     * @param awsAccessKeyId
     * @param awsSecretAccessKey
     * @return
     */
    public AmazonEC2 getAmazonEC2Client(String region, String awsAccessKeyId, String awsSecretAccessKey){
        return getAmazonEC2Client(region, awsAccessKeyId, awsSecretAccessKey, null);
    }

    /**
     * 获取AWS IAM客户端:如果配置文件中配置了代理,则同时也为IAM客户端配置代理
     * @param region
     * @param awsAccessKeyId
     * @param awsSecretAccessKey
     * @param profile
     * @return
     */
    public AmazonIdentityManagement getAmazonIdentityManagement(String region, String awsAccessKeyId, String awsSecretAccessKey, String profile){
        AWSCredentialsProvider awsCredentialsProvider = getAwsCredentialsProvider(awsAccessKeyId, awsSecretAccessKey, profile);
        ClientConfiguration clientConfiguration = getClientConfiguration();

        // 如果没有传入region参数,则将region设置为配置的值(cloud.aws.region.static)
        if(StringUtils.isEmpty(region)){
            region = configureRegion;
        }

        AmazonIdentityManagement amazonIdentityManagement = AmazonIdentityManagementClientBuilder.standard().withCredentials(awsCredentialsProvider).withClientConfiguration(clientConfiguration).withRegion(region).build();

        return amazonIdentityManagement;
    }

    /**
     * 获取AWS客户端配置,包括代理主机,端口
     * @return
     */
    private ClientConfiguration getClientConfiguration(){
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setProxyHost(awsClientConfigure.getProxyHost());
        clientConfiguration.setProxyPort(awsClientConfigure.getProxyPort());
        return clientConfiguration;
    }

    /**
     *
     * 1. 首先根据awsAccessKeyId和awsSecretAccessKey配置获取credentials
     * 2. 如果awsAccessKeyId或者awsSecretAccessKey为空,则使用传入的profile参数,如果传入的profile参数也为空,则使用default的profile
     *
     * @param awsAccessKeyId
     * @param awsSecretAccessKey
     * @param profile
     * @return
     */
    private AWSCredentialsProvider getAwsCredentialsProvider(String awsAccessKeyId, String awsSecretAccessKey, String profile){
        AWSCredentialsProvider awsCredentialsProvider;

        if(StringUtils.isNotEmpty(awsAccessKeyId) && StringUtils.isNotEmpty(awsSecretAccessKey)) {
            BasicAWSCredentials awsCredentials = new BasicAWSCredentials(awsAccessKeyId, awsSecretAccessKey);
            awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
        } else {
            // 存储在~/.aws/credentials文件中的profile: 例如:[xiaodong]
            if (StringUtils.isEmpty(profile)){  // 如果传入的profile为空,则使用默认的profile: default
                profile = AwsProfileNameLoader.DEFAULT_PROFILE_NAME;
            }
            awsCredentialsProvider = new ProfileCredentialsProvider(profile);
        }

        return awsCredentialsProvider;
    }

}

代理配置:

package com.hpe.foxcloud.core.aws.config;

import com.amazonaws.ClientConfiguration;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * Created by wanxiaod on 9/13/2017.
 */

@Component
@ConfigurationProperties(prefix = "foxcloud.aws.clientConfigure", ignoreInvalidFields = true)
@Data
public class AwsClientConfigure{
    private String proxyHost;
    private int proxyPort;
}

application.yml:

server:
  port: 9166
logging:
  path: /hpe/logs/hpe_micro/core/

foxcloud:
  aws:
    clientConfigure:
      proxyHost: web-proxy.sgp.hp.com
      proxyPort: 8080

cloud:
  aws:
    region:
      static: us-west-1

代理配置根据实际情况看是需要配置,通常在公司内网需要配置代理。另外需要配置一个初始的region:cloud.aws.region.static,如果不配置,启动时会报错