技术标签: 容器 serverless aws AWS docker 云计算
在“创建 ECS Fargate”一文中我们介绍了 ECS Fargate,一种无服务器模式的服务。
因为没有下一层服务器,所以既节省了资源(成本)又减化了维护工作量。
但方便的同时也会带来一些问题,在实践中我们碰到最多的就是如何调试的问题。
比如安装在一台 linux 服务器的 tomcat 服务器,如果我们想改 tomcat 的配置,只要登录 linux 服务器,进入 tomcat 安装目录,修改 conf 文件再重启 tomcat 就可以了。
再比如安装在一台 linux 服务器的 nginx 服务器,如果我想修改路由的转发路径,只要登录 linux 服务器,进入 nginx 安装目录,修改 conf 文件再重启 nginx 就可以了。
如果需要调试的应用是运行在 k8s 上,则我们可以登录 k8s 所在的服务器,然后用 kubectl exec 命令进入容器内部进行调试。
这三例子的共同点是我们首先都要登录应用或者其容器所在的服务器,然后进行修改重启的操作。
现在 ECS Fargate 中并没有下层服务器,如何进行类似的调试呢?
我们可以给容器增加 open-ssh 模块,然后利用 ssh 直接远程登录到容器内部,然后就可以进行调试工作。
本文利用“创建 ECS Fargate”中创建的 Fargate 集群,先创建一对 RSA KEY,然后以 httpd 官方镜像为基础增加 openssl 软件,最后在创建 Fargate task 时通过环境变量引入 Public key。这样在 task 运行后就可以通过 ssh 登录进入容器内部进行调试。
RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用,另外在 linux 系统维护中也经常使用这种技术。
我们只需要把 RAS Key pair 中的公钥(Public key)放到所要登录的服务器中后,就能用私钥(Private Key)进行免密码登录。
可以使用 ssh-keygen 命令生成 RAS Key pair,也可以利用在线网站生成,后者更简单。这里我们用命令的形式。
在装有 openssl 的 terminal 或者 linux 上运行下列命令
ssh-keygen -b 1024 -t rsa
说明:
运行结果
图 1
说明:
只需要输入保存路径和名子即可,后面直接回车。
id_rsa_test.pub 生成的公钥
图 2
最后一部分红框部分是运行 ssh-keygen 命令所在的服务器和用户名,这部分连同前面的一个空格是不需要的。
id_rsa_test 生成的私钥
图 3
生成好 Key pair,接下来我们创建新版本的 task
本文利用“AWS Fargate OpenID SSO 集成实现”中创建的目录和文件
└── Fargate_SSO
├── conf
│ ├── htaccess
│ ├── httpd.conf
│ └── oidc.conf
├── Dockerfile
├── entrypoint.sh
├── libapache2-mod-auth-openidc_2.3.11-1.stretch+1_amd64.deb
└── test.html
进入“Fargate_SSO”目录打开 Dockerfile,加入以下红框的内容
图 5
说明:
打开 entrypoint.sh,在最后加入以下内容
# Create a folder to store user's SSH keys if it does not exist.
USER_SSH_KEYS_FOLDER=~/.ssh
[ ! -d "$USER_SSH_KEYS_FOLDER" ] && mkdir -p $USER_SSH_KEYS_FOLDER && chmod 700 $U
SER_SSH_KEYS_FOLDER && echo $SSH_PUBLIC_KEY > ${USER_SSH_KEYS_FOLDER}/authorized_ke
ys
# Copy contents from the `SSH_PUBLIC_KEY` environment variable
# to the `${USER_SSH_KEYS_FOLDER}/authorized_keys` file.
# The environment variable must be set when the container starts.
# Clear the `SSH_PUBLIC_KEY` environment variable.
unset SSH_PUBLIC_KEY
# Start the SSH daemon.
/usr/sbin/sshd -D
说明:
现在我们建新的镜像并推出镜像仓库
docker build --tag tansong0091/httpd-ssh:test-only .
docker push tansong0091/httpd-ssh:test-only
镜像准备就绪,然后我们建 task 的新版本
修改“AWS Fargate OpenID SSO 集成实现”文章中 tstest_task.json 文件。
{
...
"containerDefinitions": [
{
"name": "fargate-app1",
"image": "tansong0091/httpd-ssh:test-only",
...
"environment": [
{
"name": "SSH_PUBLIC_KEY",
"value": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC/alWrS+HH5KkPbso+Tsy+Z0WGTX5wvXvon5OacLMyOU3gj2mbbIifasXf/RadpuywuyW3uFirtRlPmSb5Q0PVLODku503Xettw+u6/Z22VV7F2ACgg4iHaCo2SR4L8saUrLLfcKXKr/WCn3w7uYcqGsXEcSFCCSZgn4BoZJqP4Q=="
}
],
...
说明:
然后运行新建 task 版本命令
aws ecs register-task-definition --cli-input-json file://tstest_task.json
提示:新建 task 的命令和新建 task 版本的命令是相同的,如果重复运行就会产生新的 task 版本。
运行结果
图 6
图 7
新建的 task 版本为“6”
修改“AWS Fargate OpenID SSO 集成实现”文章中 update-svc.json 文件,把 taskDefinition 中最后数字改成“6”。
{
"cluster": "tstest",
"service": "tstest-svc",
"desiredCount": 1,
"taskDefinition": "tstest-fargate-task:6",
...
"forceNewDeployment": true,
...
}
保存文件并运行 update service 命令,更新镜像
aws ecs update-service --cli-input-json file://update-svc.json
新 task 启动中,再完全运行并通过 health check 后,老 task 才会停止,过一段时间后可以看到
图 8
点击上图中红框中的 task,进入 task 界面,记下 Public IP
图 9
找一台可以访问 internet 的电脑,创建私钥文件 id_rsa_test,并复制前面步骤中产生的 private key 到文件中。
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAIEAv2pVq0vhx+SpD27KPk7MvmdFhk1+cL176J+TmnCzMjlN4I9pm2yI
n2rF3/0WnabssLslt7hYq7UZT5km+UND1Szg5LudN13rbcPruv2dtlVexdgAoIOIh2gqNk
keC/LGlKyy33Clyq/1gp98O7mHKhrFxHEhQgkmYJ+AaGSaj+EAAAIIUWvlelFr5XoAAAAH
c3NoLXJzYQAAAIEAv2pVq0vhx+SpD27KPk7MvmdFhk1+cL176J+TmnCzMjlN4I9pm2yIn2
rF3/0WnabssLslt7hYq7UZT5km+UND1Szg5LudN13rbcPruv2dtlVexdgAoIOIh2gqNkke
C/LGlKyy33Clyq/1gp98O7mHKhrFxHEhQgkmYJ+AaGSaj+EAAAADAQABAAAAgFG0S9kQTN
GMMvWZbs5lyFNFtZF8Jops9yT2aIS1smevuiQuUv+6th6F7uyLFUo55DIT0Ce5km/In4Mw
dkhTg/IPWwGUtpQqE+KgOMR5HMNbPkZUg35hZ0Bb85Vxz7q8wtGhyuo1dULEl0P/winTBb
GirNjYbaT1T3vwtrvNCFSBAAAAQGuuXNgrzGlwuUBVA1h397U/YjxxZNzuunMb1o5dM0g2
TxCJSl5mXIbaag8DjUEPLiClVuaqa75FPZua7TGWqa0AAABBAOVaGSvSrnA1f0C49sv+07
WTZyydwAco5RJEoHA9XJUJ2motEno6dDLP/h3FVh4D30umCu3NBORVzboEwPUquZkAAABB
ANWn116XjcXUH+3H0Tn5Qn5lNT5EYFvRANb30gODIoW24qqo+npeTeNP3VtjF7Wd71jY7y
WF77JBCFMljarPRYkAAAAOdGFuc0BHRFNWR1FRMkUBAgMEBQ==
-----END OPENSSH PRIVATE KEY-----
提示:如果利用 windows terminal 或者 linux 测试,需要把文件的权限改成 400。chmod 400 id_rsa_test
运行如下命令测试登录
ssh -i id_rsa_test [email protected]
图 10
从上面可以看到我们已经登录到 aws 的容器中,之后就可以按常规方法进行调试。
安全处理:实际环境中我们一般不会在 task 容器中启动 Public IP,而是只有 Private IP。这时我们需要在 AWS 上有一台处在相同 subnet 的 EC2 做为堡垒机,从堡垒机上进入容器内部。
其它镜像:不同镜像基于的系统版本不同,所以加入 openssh 软件时的命令略有不同。在资源下载中放了 httpd,tomcat,java 三个不同的 Dockerfile 以供参考。
多容器镜像:当一个 task 中存在多个容器时,我们需要给每个容器分配不同的 ssh 端口,这可以在生成镜像时,修改 sshd_config 文件内的 port 实现。
环境变量:实际中我们可以把 Public key 保存在 AWS System manager 的 Parameter Store 中,然后在创建 task 时用 secret 参数引入。
相关文件可以在以下链接下载
https://github.com/tansong0091/realCrapForAWS/tree/main/debug_container
https://github.com/tansong0091/realCrapForAWS/tree/main/Fargate_SSO
本文使用的技术也是在实践中总结出来的,在应用部署到 AWS Fargate 之前根本就没有这种需求,因为可以在服务器上方便的进入容器进行调试。
虽然也可以在本地调试好之后再部署到 AWS Fargate 上,但总会碰到本地运行成功,在 Fargate 运行失败的情况。这时最有效的方法就是在 Fargate 的容器内直接调试。
喜欢请点赞,欢迎转发
微信公众号“全是 AWS 干货”
文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99
文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效
文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是
文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件
文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件
文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码
文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware
文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停
文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待
文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析
文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code
文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象