云服务器内容精选

  • SecuredHttpClientConfigCallback代码示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.common.Nullable; import java.util.Objects; class SecuredHttpClientConfigCallback implements RestClientBuilder.HttpClientConfigCallback { @Nullable private final CredentialsProvider credentialsProvider; /** * The {@link SSLIOSessionStrategy} for all requests to enable SSL / TLS encryption. */ private final SSLIOSessionStrategy sslStrategy; /** * Create a new {@link SecuredHttpClientConfigCallback}. * * @param credentialsProvider The credential provider, if a username/password have been supplied * @param sslStrategy The SSL strategy, if SSL / TLS have been supplied * @throws NullPointerException if {@code sslStrategy} is {@code null} */ SecuredHttpClientConfigCallback(final SSLIOSessionStrategy sslStrategy, @Nullable final CredentialsProvider credentialsProvider) { this.sslStrategy = Objects.requireNonNull(sslStrategy); this.credentialsProvider = credentialsProvider; } /** * Get the {@link CredentialsProvider} that will be added to the HTTP client. * * @return Can be {@code null}. */ @Nullable CredentialsProvider getCredentialsProvider() { return credentialsProvider; } /** * Get the {@link SSLIOSessionStrategy} that will be added to the HTTP client. * * @return Never {@code null}. */ SSLIOSessionStrategy getSSLStrategy() { return sslStrategy; } /** * Sets the {@linkplain HttpAsyncClientBuilder#setDefaultCredentialsProvider(CredentialsProvider) credential provider}, * * @param httpClientBuilder The client to configure. * @return Always {@code httpClientBuilder}. */ @Override public HttpAsyncClientBuilder customizeHttpClient(final HttpAsyncClientBuilder httpClientBuilder) { // enable SSL / TLS httpClientBuilder.setSSLStrategy(sslStrategy); // enable user authentication if (credentialsProvider != null) { httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } return httpClientBuilder; } }
  • ESSecuredClientWithCerDemo代码示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 import org.apache.commons.io.IOUtils; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.HttpHost; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.FileInputStream; import java.io.IOException; import java.security.KeyStore; import java.security.SecureRandom; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManagerFactory; public class ESSecuredClientWithCerDemo { private static final String KEY_STORE_PWD = ""; private static final String TRUST_KEY_STORE_PWD = ""; private static final String CA_JKS_PATH = "ca.jks"; private static final String CLIENT_JKS_PATH = "client.jks"; private static final String ELB_ADDRESS = "127.0.0.1"; private static final int ELB_PORT = 9200; private static final String CSS _USERNAME = "user"; private static final String CS S_PWD = ""; public static void main(String[] args) { // 建立客户端 RestHighLevelClient client = initESClient(ELB_ADDRESS, CSS_USERNAME, CSS_PWD); try { // 查询 match_all,相当于 {\"query\": {\"match_all\": {}}} SearchRequest searchRequest = new SearchRequest(); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchRequest.source(searchSourceBuilder); // query SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); System.out.println("query result: " + searchResponse.toString()); SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } System.out.println("query success"); Thread.sleep(2000L); } catch (InterruptedException | IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(client); } } private static RestHighLevelClient initESClient(String clusterAddress, String userName, String password) { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); SSLContext ctx = null; try { KeyStore ks = getKeyStore(CLIENT_JKS_PATH, KEY_STORE_PWD, "JKS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(ks, KEY_STORE_PWD.toCharArray()); KeyStore tks = getKeyStore(CA_JKS_PATH, TRUST_KEY_STORE_PWD, "JKS"); TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); tmf.init(tks); ctx = SSLContext.getInstance("SSL", "SunJSSE"); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom()); } catch (Exception e) { e.printStackTrace(); } SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(ctx, new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } }); SecuredHttpClientConfigCallback httpClientConfigCallback = new SecuredHttpClientConfigCallback(sessionStrategy, credentialsProvider); RestClientBuilder builder = RestClient.builder(new HttpHost(clusterAddress, ELB_PORT, "https")) .setHttpClientConfigCallback(httpClientConfigCallback); RestHighLevelClient client = new RestHighLevelClient(builder); return client; } private static KeyStore getKeyStore(String path, String pwd, String type) { KeyStore keyStore = null; FileInputStream is = null; try { is = new FileInputStream(path); keyStore = KeyStore.getInstance(type); keyStore.load(is, pwd.toCharArray()); } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(is); } return keyStore; } }
  • 创建独享型负载均衡器 登录弹性负载均衡管理控制台。 参考创建独享型负载均衡器,创建独享型负载均衡器。CSS集群对接独享型负载均衡器所需要关注的参数如表3所示,其他参数请根据实际需要填写。 表3 独享型负载均衡器的配置说明 参数 配置说明 取值样例 实例类型 选择“独享型”。 独享型 计费模式 性能独享型负载均衡器的收费类型。 按需计费 区域 选择CSS集群所在的区域。 - 跨VPC后端 开启跨VPC后端才能连接CSS集群。 开启 网络类型 负载均衡器对外提供服务所使用的网络类型。 CSS服务支持“IPv4私网”和“IPv6网络”。 当选择“IPv6网络”时,CSS服务对接负载均衡器后,集群对接的负载均衡实例会显示“私有IP”和“IPv6地址”。只有当独享型负载均衡器绑定了“共享带宽”,才会显示“公网IP”。 当选择“IPv4私网”时,CSS服务对接负载均衡器后,集群对接的负载均衡实例会显示“私有IP”和“公网IP”。 说明: CSS服务仅“华东二”区域支持“IPv6网络”,其他区域只支持“IPv4私网”。 IPv4私网 所属VPC 所属虚拟私有云。无论选择哪种网络类型,均需配置此项。 需要选择和CSS集群同一VPC。 - 子网 选择创建负载均衡实例的子网。无论选择哪种网络类型,均需配置此项。 需要选择和CSS集群同一子网。 - 规格 建议选择功能和性能更优的应用型规格。 应用型(HTTP/HTTPS) “小型 I”
  • 集群对接负载均衡器 登录 云搜索服务 管理控制台。 在“集群管理”页面选择需要对接负载均衡器的集群,单击集群名称进入集群“基本信息”页面。 在左侧菜单栏,选择“负载均衡”,打开负载均衡开关,在弹窗中配置负载均衡基础信息。 表4 配置负载均衡 参数 说明 负载均衡器 选择前面创建的独享型负载均衡器。CSS集群属于托管资源,所选的负载均衡器必须开启“跨VPC后端”能力才能正常使用。 委托 选择 IAM 委托,当前账号授权CSS服务访问和使用ELB资源。 当首次配置委托时,可以单击“自动创建委托”新建委托“css-elb-agency”直接使用。 当已有自动创建的委托时,可以单击“委托一键授权”,删除委托中“ELB Administrator”系统角色或“ELB FullAccess”系统策略的权限,新增如下自定义策略授权委托到最小化权限。 "elb:loadbalancers:list", "elb:loadbalancers:get", "elb:certificates:list", "elb:healthmonitors:*", "elb:members:*", "elb:pools:*", "elb:listeners:*" “自动创建委托”和“委托一键授权”需要如下最小权限。 "iam:agencies:listAgencies", "iam:roles:listRoles", "iam:agencies:getAgency", "iam:agencies:createAgency", "iam:permissions:listRolesForAgency", "iam:permissions:grantRoleToAgency", "iam:permissions:listRolesForAgencyOnProject", "iam:permissions:revokeRoleFromAgency", "iam:roles:createRole" 使用委托需要如下最小权限。 "iam:agencies:listAgencies", "iam:agencies:getAgency", "iam:permissions:listRolesForAgencyOnProject", "iam:permissions:listRolesForAgency" 图1 开启负载均衡 单击“确定”,开启负载均衡。 在“监听器配置”区域,您可以单击右侧配置监听器的相关信息。 表5 配置监听器 参数 配置说明 前端协议 客户端与负载均衡监听器建立流量分发连接的协议。支持选择“HTTP”或“HTTPS”。 根据实际业务需要选择协议。 前端端口 客户端与负载均衡监听器建立流量分发连接的端口。 根据实际业务需要自定义。 SSL解析方式 客户端到服务器端认证方式。仅“前端协议”选择“HTTPS”才需要配置。 根据实际业务需要选择解析方式。 服务器证书 服务器证书用于SSL握手协商,需提供证书内容和私钥。仅“前端协议”选择“HTTPS”才需要配置服务器证书。 选择准备并上传自签名证书创建的服务器证书。 CA证书 CA证书又称客户端CA公钥证书,用于验证客户端证书的签发者。仅“SSL解析方式”选择“双向认证”时,才需要配置CA证书。 选择准备并上传自签名证书创建的CA证书。 在开启HTTPS双向认证功能时,只有当客户端能够出具指定CA签发的证书时,HTTPS连接才能成功。 图2 配置监听器 (可选)在监听器配置区域,单击“访问控制”后的“设置”跳转到负载均衡器的监听器列表,单击监听器访问控制列的“设置”,配置允许通过负载均衡实例访问集群的IP地址组,不设置的话默认允许所有的IP地址访问。 在健康检查区域,您可以查看各个节点IP的健康检查结果。 表6 健康检查结果状态说明 健康检查结果 说明 正常 节点IP连接正常。 异常 节点IP连接,不可用
  • 通过Curl命令接入集群 在 云搜索 服务管理控制台,单击左侧导航栏的“集群管理”。 在集群管理列表页面,单击需要访问的集群名称,进入集群基本信息页面。 在左侧菜单栏选择“负载均衡”,获取并记录负载均衡实例的“私有IP”、“IPv6地址”或“公网IP”。 如果ELB绑定了公网,则不推荐接入非安全模式的集群。非安全模式的集群使用HTTP通信且不需要安全认证即可访问,如果对接公网访问存在安全风险。 在ECS服务器中执行如下Curl命令测试能否通过独享型负载均衡实例接入集群。 表7 不同集群的接入命令 集群安全模式 ELB最终对外提供的服务形态 接入集群的Curl命令 非安全 无认证 curl http://IP:9200 单向认证 curl -k --cert ./client.crt --key ./client.key https://IP:9200 双向认证 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:9200 安全+HTTP 密码认证 curl http://IP:9200 -u user:pwd 单向认证+密码认证 curl -k --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 双向认证+密码认证 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 安全+HTTPS 单向认证+密码认证 curl -k --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 双向认证+密码认证 curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:9200 -u user:pwd 表8 变量说明 变量名 说明 IP 负载均衡实例的IP地址。 user 集群的用户名,仅安全集群需要配置。 pwd 用户名对应的密码,仅安全集群需要配置。 当可以正常返回集群信息时,表示连接成功。
  • 场景描述 使用独享型负载均衡器接入集群具有如下优点: 非安全模式集群也支持集成弹性负载均衡服务的能力。 支持用户使用自定义证书进行HTTPS双向认证。 支持7层流量监控及告警配置,方便用户随时查看监控情况。 不同安全模式的集群对接独享型负载均衡器共有8种不同的服务形态,不同服务形态对应的ELB能力如表1所示,8种组合的配置概览如表2所示。 表1 不同集群对应的ELB能力 集群安全模式 ELB最终对外提供的服务形态 ELB负载均衡 ELB流量监控 ELB双向认证 非安全 无认证 支持 支持 不支持 单向认证 双向认证 支持 支持 支持 安全+HTTP 密码认证 支持 支持 不支持 单向认证+密码认证 双向认证+密码认证 支持 支持 支持 安全+HTTPS 单向认证+密码认证 双向认证+密码认证 支持 支持 支持 表2 不同集群对接ELB的配置概览 集群安全模式 ELB最终对外提供的服务形态 ELB监听器 后端服务器组 前端协议 前端端口 SSL解析方式 后端协议 健康检查端口 健康检查路径 非安全 无认证 HTTP 9200 无认证 HTTP 9200 / 单向认证 HTTPS 9200 单向认证 HTTP 9200 双向认证 HTTPS 9200 双向认证 HTTP 9200 安全+HTTP 密码认证 HTTP 9200 无认证 HTTP 9200 /_opendistro/_security/health 单向认证+密码认证 HTTPS 9200 单向认证 HTTP 9200 双向认证+密码认证 HTTPS 9200 双向认证 HTTP 9200 安全+HTTPS 单向认证+密码认证 HTTPS 9200 单向认证 HTTPS 9200 双向认证+密码认证 HTTPS 9200 双向认证 HTTPS 9200 CSS集群对接独享型负载均衡的操作步骤如下: 如果规划ELB监听器的前端协议是HTTPS,则需要准备签名证书并上传至ELB管理控制台:准备并上传自签名证书 在ELB管理控制台创建独享型负载均衡器:创建独享型负载均衡器 Elasticsearch或OpenSearch集群开启负载均衡:集群对接负载均衡器 通过独享型负载均衡实例接入集群:通过Curl命令接入集群 本文还提供了通过独享型负载均衡实例接入集群的Java客户端代码示例:通过负载均衡器的HTTPS双向认证方式接入集群的代码示例(Java)
  • 约束限制 如果ELB绑定了公网,则不推荐接入非安全模式的集群。非安全模式的集群使用HTTP通信且不需要安全认证即可访问,如果对接公网访问存在安全风险。 开启了HTTPS访问的安全模式的集群不支持HTTP类型的前端协议认证,如果需要使用HTTP类型的前端协议,需要将集群的“安全模式”变更为“非安全模式”,具体操作请参见更改Elasticsearch集群安全模式。在变更安全模式前,请先关闭“负载均衡”,安全模式变更完成后再开启“负载均衡”。
  • 约束限制 集群开启终端节点服务之后,终端节点将按需进行收费,终端节点的费用将由用户进行支付,详细的计费方式请参考终端节点计费说明。 当集群的网络配置中,“虚拟私有云”选择的是共享VPC,“子网”选择的是共享VPC下的子网,则该集群不支持配置终端节点服务。 创建终端节点需要有相关的权限,请参考 VPC终端节点 权限管理。 公网访问和终端节点服务使用的是同一个负载均衡。当集群开启了公网访问白名单,由于白名单是作用在负载均衡上面,将会同时限制公网访问集群和内网通过VPCEP访问集群的IP地址。此时需要在公网访问白名单中添加一个网络白名单“198.19.128.0/17”,通过该白名单用来放通经过VPCEP的流量。 终端节点服务开通后,在内网通过终端节点IP或内网 域名 访问CSS将不受集群安全组规则限制,需要配合终端节点本身的白名单功能进行访问控制,操作指导请参见设置终端节点的访问控制。
  • 创建集群时开启终端节点服务 登录云搜索服务管理控制台。 在右上方单击“创建集群”。 在创建集群页面,“高级配置”选择“自定义”后,开启终端节点服务。 图1 开启终端节点服务 表1 配置终端节点服务 参数 说明 创建内网域名 勾选“创建内网域名”,系统除了生成一个“节点IP”还会自动创建一个“内网域名”,通过这个域名可以在同一个VPC内访问该集群。不勾选的话只会生成一个“节点IP”。 创建专业型终端节点 选择是否创建专业型终端节点。 不勾选,则创建基础型终端节点。 勾选,则创建专业型终端节点。 说明: 当集群所在区域不支持创建专业型终端节点时,该选项将置灰不可选。默认创建的是基础型终端节点。 IPv4/IPv6双栈网络 选择是否开启IPv4/IPv6双栈网络。仅当集群的VPC“子网”已开启IPv6,且已勾选“创建专业型终端节点”时,才支持选择开启IPv4/IPv6双栈网络。 终端节点服务白名单 在“终端节点服务白名单”中添加允许通过节点IP或内网域名访问集群的账号。 单击“添加”输入授权账号ID。授权账号ID配置成“*”,则表示允许全部用户访问该集群。 单击操作列的“删除”,可以删除不允许访问的账号ID。 说明: “授权账号ID”可以在“我的凭证”中进行查看“账号ID”获取。
  • 已有集群的终端节点服务管理 如果创建集群时未开启终端节点服务,集群创建成功后,可以通过如下步骤进行开启。 登录云搜索服务管理控制台。 在集群管理页面,单击需要开启终端节点服务的集群名称,进入集群基本信息页面。 选择“终端节点服务”,在“终端节点服务”右侧单击开关,打开集群的终端节点服务功能。 表2 配置终端节点服务 参数 说明 创建内网域名 勾选“创建内网域名”,系统除了生成一个“节点IP”还会自动创建一个“内网域名”,通过这个域名可以在同一个VPC内访问该集群。不勾选的话只会生成一个“节点IP”。 创建专业型终端节点 选择是否创建专业型终端节点。 不勾选,则创建基础型终端节点。 勾选,则创建专业型终端节点。 说明: 当集群所在区域不支持创建专业型终端节点时,该选项将置灰不可选。默认创建的是基础型终端节点。 IPv4/IPv6双栈网络 选择是否开启IPv4/IPv6双栈网络。仅当集群的VPC“子网”已开启IPv6,且已勾选“创建专业型终端节点”时,才支持选择开启IPv4/IPv6双栈网络。 终端节点服务白名单 在“终端节点服务白名单”中添加允许通过节点IP或内网域名访问集群的账号。 单击“添加”输入授权账号ID。授权账号ID配置成“*”,则表示允许全部用户访问该集群。 单击操作列的“删除”,可以删除不允许访问的账号ID。 说明: “授权账号ID”可以在“我的凭证”中进行查看“账号ID”获取。 管理终端节点。 在终端节点服务页面下,显示所有连接当前集群的终端节点。此处可以获取终端节点的“服务地址”和“内网域名”。 图2 管理终端节点 单击操作列的“接受”或者“拒绝”可以修改节点的“状态”。如果对某个终端节点“拒绝”操作之后,其生成的内网域名将不能再访问到当前集群。
  • 通过节点IP地址或内网域名访问集群 获取集群的内网域名或者节点IP地址。 登录云搜索服务控制台,进入集群列表,单击集群名称,进入集群“基本信息”页面,选择“终端节点服务”,查看“服务地址”或“内网域名”。 图3 查看终端节点服务地址或内网域名 在弹性云服务器中,直接通过Curl命令调用Elasticsearch API即可使用集群。 弹性云服务器需要满足如下要求: 为弹性云服务分配足够的磁盘空间。 此弹性云服务器的VPC需要与集群在同一个VPC中,开通终端节点服务后,可以实现跨VPC访问。 此弹性云服务器的安全组需要和集群的安全组相同。 如果不同,请修改弹性云服务器安全组或配置弹性云服务器安全组的出入规则允许集群所有安全组的访问。修改操作请参见配置安全组规则。 待接入的CSS集群,其安全组的出方向和入方向需允许TCP协议及9200端口,或者允许端口范围包含9200端口。 例如,执行如下Curl命令,查看集群中的索引信息,集群中的内网访问地址为“vpcep-7439f7f6-2c66-47d4-b5f3-790db4204b8d.region01.huaweicloud.com”,端口为“9200”。 如果接入集群未启用安全模式,接入方式为: curl 'http://vpcep-7439f7f6-2c66-47d4-b5f3-790db4204b8d.region01.huaweicloud.com:9200/_cat/indices' 如果接入集群已启用安全模式,则需要使用https方式访问,并附加用户名和密码,在curl命令中添加-u选项。 curl -u username:password -k 'https://vpcep-7439f7f6-2c66-47d4-b5f3-790db4204b8d.region01.huaweicloud.com:9200/_cat/indices'