AWS Session Manager connect to EC2 instance

The most common way to manage a remote machine is SSH (Unix/Linux, Mac) or PowerShell/RDP (Windows), which requires the remote machine to open the corresponding access port and firewall, credentials or SSH Key. When selecting an EC2 instance on AWS console, we can click the "Connect" button, which provides three connection options:

  1. EC2 Instance Connect: Requires EC2 to be configured with SSH Key, sshd is started, ssh inbound port allowed by Security Group, ec2-instance-connect installed(sudo yum install ec2-instance-connect)
  2. Session Manager: This is what we are going to talk about next. sshd is not required(SSH key is not needed of cause). Security Group only requires outbound port 443. 
  3. SSH client: Client SSH to EC2 instance, start sshd, allow inbound ssh port 22 by Security Group, use SSH Key or username and password in AMI, or configure to login with domain account after joining the domain.

AWS Session Manager provides access to EC2 instances through a browser or AWS CLI, and even machines or virtual machines in the local datacenter (requires advanced-instances tier support) , and no longer depends on SSH.

Session Manager Overview

Session Manager determines who can or cannot be accessed by the IAM access policy. It can be forwarded through the local port, the operation log in the session can be recorded as an audit, and can configure to send a message to Amazon EventBridge or SQS when session open or closed. The session log encrypted by a KMS key. 阅读全文 >>

AWS Session Manager 管理 EC2 实例

管理一个远程机器最常规的做法是 SSH(Unix/Linux, Mac) 或 PowerShell/RDP(Windows),这就要求远端机器要开通相应的访问端口及打开防火墙,配置好登陆用的用户名密码或 SSH Key。当选择一个 EC2 实例的时候,可以点击 "Connect" 按,它提供有三种连接选择:

  1. EC2 Instance Connect: 要求 EC2 配置了 SSH Key, 启动了 sshd 并开启了 ssh 的 Security Group,还要在实例上安装了 ec2-instance-connect(如安装命令 sudo yum install ec2-instance-connect)
  2. Session Manager: 这就是我们本文要讲述的,sshd 不用启动,Security Group 只要求能往连接外部的 443 端口,SSH Key 不需要
  3. SSH client: 客户端 SSH 到 EC2 实例,需要打开 sshd 其 22 号端口接受连接的 Security Group,用 SSH Key 或 AMI 中的用户名和密码,或配置加入了域后使用域帐号验证登陆

AWS 的 Session Manager 提供了通过浏览器或 AWS CLI 来访问 EC2 实例,甚至是本地机房的机器或虚拟机(需 advanced-instances tier 的支持),不再依赖于 SSH。 阅读全文 >>

用 AWS Secrets Manager 存储和管理密钥

目前我们在 AWS 上把密钥,API Key  等信息是存储在  AWS Systems Manager 的 Parameter Store 中,它只提供了用 KMS Key 加密存储字符串的功能,最大字符串大小是 4096 个字符,它是免费的。

最近发现 AWS 上有一个新的服务 AWS Secrets Manager(2018 年 4 月发布的),听起来用它来存储密钥信息更高大上些。它同样提供了用 KMS Key 加密存储字符串的功能,字符串最大也是 4096 个字符。从 AWS Web 控制台上看可配置用 Key/Value 的形式,其实本质也是存储为一个 JSON 字符串。

Secrets Manager 与 Parameter Store 更多的功能是能与 RDS 集成 -- 选择数据库收集数据库的配置信息(主机名,端口,实例等), 还有就是可配置定期更新密钥,这对一个安全的系统定期改密码很重要。对于定期更新密钥的未作深入研究,AWS Secrets Manager 本身知道如何轮换 RDS 数据库的密钥,其他的需要一个 Lambda 来支持。 阅读全文 >>

Terraform aws_iam_policy_attachment Policy 竞争问题

自从  Terraform  resource "aws_iam_role" 不推荐使用 "inline_policy" 和  "managed_policy_arns" 以后,就尝试了用 "aws_iam_policy_attachment" 来为 iam role 指定 AWS  内置和自定义的 IAM policy。因为在官方文档 aws_iam_role 中最先看到的就是 aws_iam_policy_attachment, 其实仔细阅读该文档的话,建议是

  1. 用 "aws_iam_role_policy" 来代替 "inline_policy"
  2. 用  "aws_iam_role_policy_attachment"  来代替 "managed_policy_arns"

然后在项目中为避免 inline_policy 和 managed_policy_arns 的警告而选择了通用的 aws_iam_policy_attachment, 同时原来也用的 "aws_iam_policy",而非 "aws_iam_role_policy。 所以才撞入到以前一直用 aws_iam_role(inline_policy, managed_policy_arns) + aws_iam_policy 就没出过问题。 阅读全文 >>

Python unittest.mock 的基本使用

平时随意用 Python 写的用了就丢的小工具当然没必要写什么单元测试,如果是一个要反复打磨的工具,项目,单元测试就必须重视起来了。因为简单思路写出来的代码将要应对各种未知情形,加之想要大肆的重构,有了足够的测试用例才能安心。

任何语言白盒的单元测试首先面对的就是 Mock,  不光是应对有副作用的操作,最好是隔离所有不在当前所见到的代码的任何调用,其实像 print 这种有副作用的代码一般是能容忍的,可能也是为何很多测试框架默认会把控制台的输出关掉。

在 Python 中,一般基本的东西自己都有,Mock 就直接用 unittest.mock,可应用于所有的单元测试框架中,如 unittest, pytest。另有一块对 uniitest.mock 的简单封装,专为 pytest 提供方便的 pytest-mock。今天先了解 unittest.mock 的使用,它的官方文档是 unittest.mock -- mock object library阅读全文 >>

Python 3.12 新特性

继续感受新特性系列,这次看看于 2023 年 10 月 2 日发布的 Python 3.12 给我们带来了什么新特性。Python 3.14 预计在今年 10 月份推出,一定要对每年一个正式版的新东西有所了解。依旧是由官方的 What's New In Python 3.12 阅读进行展开。

Python 3.12 从编程上的观感变化不大,主要是移除了 distutils, 增加了 f-stringstype 提示,其他对诸如迭代推导等的字节码优化,对性能的提示是不具有直接感受的。

Python 3.12 移除了 distutils(Distribution Utilities)

distutils 是一个 Python 内建的构建,打包和分布 Python 模块/包的工具集,其实对于多数应用开发人员对此也是感的。能与此能顺利建立关联的就是有些 Python 项目中的那个 setup.py 文件,那也是史前的产物。随着 Python 的快速流行,Python 的包管与构建工具也多了起来, 像 Poetry, PDMuv, 尤其是 uv(Rust 编写的) 的闪电速度及全能表现有望成为 Python 界的 Maven。 阅读全文 >>

演示 MCP 服务与 Claude 桌面版或 LM Studio 的集成

AI 领域真是风头正劲,各种概念扑面而来,像 AGI, RAG, AI Agent, Agentic AI 等,目前的 MCP(Model Context Protocol, 模型上下文协议) 又随处可见。MCP 是 Anthropic 于 2024 年 11 月底推出的一种开放标准,旨在统一大模型与外部数据源和工具之间的通信协议。MCP 使用 LLM 应用能安全的访问和操作外部资源,轻松的实现了 Function Calling 的功能。

试想一下,以前问大语言模型一个复杂一点的计算题

12345 的 6.7 次方是多少?

光语言模型只会在自己的向量数据库里找简单的碰到过的计算题,如 100 的 2 次方,但看到偏门的计算就会出现幻觉了,因为它没有实际的计算引擎。下面是在 LM Studio 中使用 qwen2.5-7b-instruct-mlx 模型时的结果 阅读全文 >>

Java 17 新特性之密封类型

工作中所有项目都已升级到了当前的 LTS 版 Java 21, 眼看 Java 快要来到了下一个 LTS 版本 - Java 25,将于今年 9 月份发布。四年前记录过一篇 Java 10 ~ 16 一路向前冲(新特性一箩筐),其中夹杂着孵化,预览中的以及正式的特性。现在继续跟随着 Java 16 之后版本的特性,主要讲述正式的,可直观体验到的特性,孵化与预览中的特性只会简单提及。

先还是看下 Java 的发布日期安排 Oracle Java SE Support Roadmap

版本                     发布日                        原定支持至               延期支持至
Java 17(LTS)      2021/9                       2026/9                      2029/12
Java 18-20         2022/3 - 2023/3      2022/9 - 2023/9     N/A
Java 21(LTS)      2023/9                       2028/9                     2031/9
Java 22               2024/3                       2024/9                      N/A
Java 23               2024/9                       2025/3                      N/A
Java 24               2025/3                       2025/9                      N/A
Java 25(LTS)      2025/9                       2030/9                     2033/9

也就是每两年(9月份)会有一个 LTS 版本,中间若干过度版本。在正式项目中尽可能只用 LTS 版本,因为 LTS 版更稳定,且有长期的补丁,不能项目进行中不得不在进行非 LTS 主版本升级。 阅读全文 >>

Apache Airflow 分支与条件流程

来到稍微复杂一点的流程,虽说 DAG 不能有循环但分支还是可以有的。比如下面的分支流程

start >> [task1, task2] >> end

在 Airflow UI 中展示出来就是

Airflow 默认下游 Task 的 trigger_ruleall_success,  即要求上游的所有 Task 都必须成功才会执行,否则跟随着失败或跳过,这对于并行处理然后汇集结果的应用是合理的。

本文将要使用到的是分支(BranchPythonOperator), 比如共用一个 DAG, 周中与周末执行不同的分支,或根据条件从不同的数据源采集数据,下流的任务则需在任何一个分支成功即可触发。对上面的流程加上辅助任务,使其表达性更强 阅读全文 >>

Apache Airflow 3.0 使用 Asset-Aware DAG(producer/consumers)

继续玩弄那个小风车,先前买的 《Data Pipelines with Apache Airflow》 一眼没看直接作废,因为是基于 Apache Airflow 2.x 的,3.0 既出立马又买了该书的第二版,倒是基于 Apache Airflow 3.0 的,但写书之时 3.0 尚未正式推出,所以书中内容与实际应用有许多出入。

Apache Airflow 自 2.4 起就支持基于 Asset 事件触发 DAG,那时叫做 Data-aware,从 Apache Airflow 3.0 起更名为 Asset-Aware, 并且在 UI 上也会显示使用到的 Assets。那么 Asset-Aware  解决什么问题呢,它采用了 Producer/Consumer 模式可把依赖的某一共同资源的  DAG 串联起来。比如某一个 Producer DAG 写了文件到 s3://asset-bucket/example.csv, (发布一个事件 ), 然后相当于订阅了该事件所有相关 Consumer DAG 都会得到执行。

Airflow 的 Asset 使用 URI 的格式

  1. s3://asset-bucket/example.csv
  2. file://tmp/data/export.json
  3. postgresql://mydb/schema/mytable
  4. gs://my-bucket/processed/report.parquet

阅读全文 >>