跨账号SSM启动会话遇“Target is not connected”问题及无缝访问需求
问题背景
执行命令:aws ssm start-session --target i-yyyaf4692d801d1xx --region ap-south-1
返回错误:Target is not connected。原因是目标实例属于同一组织内的账号B,无法直接添加到账号A的Systems Manager清单中。已确认:
- 账号A的用户权限经IAM模拟器验证有效
- 实例ID唯一且仅关联账号B
- 账号B本地用户可正常访问该实例
已知通过STS Assume Role可以实现跨账号访问,但需要无需手动生成临时凭证的无缝方案。
无缝实现方法
1. 配置账号B的信任角色
在账号B中创建一个IAM角色(比如SSMCrossAccountAccessRole),信任策略允许账号A的用户或角色进行Assume Role:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::账号A-ID:user/你的用户名" }, "Action": "sts:AssumeRole" } ] }
同时给该角色附加AmazonSSMFullAccess(或仅包含ssm:StartSession、ssm:DescribeSessions等最小权限的自定义策略),确保能执行SSM会话操作。
2. 配置AWS CLI自动切换角色
在本地AWS CLI的配置文件(~/.aws/config)中添加新配置项,自动获取账号B的临时凭证:
[profile account-b-ssm] role_arn = arn:aws:iam::账号B-ID:role/SSMCrossAccountAccessRole source_profile = account-a region = ap-south-1
其中source_profile是你本地已配置的账号A的CLI配置文件名称。
3. 直接执行跨账号SSM会话命令
无需手动生成临时凭证,直接用以下命令访问账号B的实例:aws ssm start-session --target i-yyyaf4692d801d1xx --profile account-b-ssm
4. 脚本封装(可选)
如果需要更简化操作,可编写Shell脚本(比如ssm-cross-account.sh):
#!/bin/bash TARGET_INSTANCE=$1 PROFILE="account-b-ssm" REGION="ap-south-1" aws ssm start-session --target $TARGET_INSTANCE --profile $PROFILE --region $REGION
赋予脚本执行权限:chmod +x ssm-cross-account.sh
使用时直接运行:./ssm-cross-account.sh i-yyyaf4692d801d1xx
关键说明
- 确保账号A的用户拥有
sts:AssumeRole权限,允许访问账号B的目标角色ARN - 遵循最小权限原则,避免给角色附加过度宽泛的权限
- CLI配置文件会自动处理临时凭证的获取和刷新,无需手动干预
内容的提问来源于stack exchange,提问作者Surya Prakash

