今天写了个Terraform的小练习,内容很简单,通过resources创建一个VPC,公网上是跳板机,私网上是内部服务器,配置好之后可以通过跳板机访问内网服务器。

写好的内容在这。
https://github.com/beanxyz/task1

这个内容比较基础,就不赘述。这个过程中遇见了两个比较有趣的问题,记录一下。

第一个问题是,当我执行terraform apply的时候,当他开始创建EC2 的时候,报错了

这个错误咋一看好像是权限问题,但是我的terraform服务器是一台EC2,我明明给与了这个Role足够的权限执行操作啊。

Error: Error launching source instance: UnauthorizedOperation: You are not authorized to perform this operation. Encoded authorization failure message: Fk7fH_uPkzcuml_wTj_44DZEfv_-c9Tu_4gEvk0dL5JfHDbDKTt0aTGoN2TWBfybTlWgHfv2CQODgLgdFjJZPbGJ6Sad-b7imYvdtCki-Bze_zg2KfoV3d25R0q1Oqg0Vxsol6w7bXW9hTw7w9A0sbXu7EH89mQb3eXBaV_s4qPbNMCJVZyba7fNjl6VYhznldORjAv8QGppk1WgXcO94vI6NVs_rfz99vuj48pVP0shVllHtiVUQFCMn_dPepk85dmBWFqfHUpRx10UaDm-IiqihGKEVKuSIVqpJCzLwbLl4VpTyX3MnnNtITBhyCsos7KTmHDqvEusvtjCwuw-jnKr9c_4uV9jI1muhWTooSa8EzUvXFaJe5UOfbYgXN898ykC7MEvqF9TUDyTH-YReWVeeAW6C7BI9xrZc50hydYABYoGOJUeUNPffuby2bvVdsoDA-4p2D4tmnld0CTiubUlLAsR2w3SP1au_96Fyypelmxu0PStdg7w2XG01YHrAgWhUg4lX5YFR_bl7YESNxOLYlTNJcHSvgZi-1vN_dMhSB7wKrihdFOS_SrK_lWzOIwJogYMTfJyxaUnzHt485OZHEIu1NKeyftFRv6C8Op1LcbM4Vv1KVx-BMgAShn2HK8rbdT4G4cqv7dMgw39YX4x27ZYOqH6b_b4s9ok_9IVvCt5r5KtGwbB7bgtE4y-WERCVDtc25L88INGqfkIG2K_Tl9SCp5OSDDaDXU0LypEzZsgr9dLuY2AYjo7kapbWXFAk-IIc4Q5MH6hx9M694gjaZRkZEZl9mbXJJ0_VgLtdxE6fzqNcfYKZsEbDvXjts-VTWKZHxo4owaWO9WZw-AMDfDz9PyiPMq2AXG2ioTkiTJeS9KDOjBNSj4cJNdVhs5ic5paQ5eiKo7rxl3QDeDRfJzPZCAlnbB32iCnGa6MadwDzb8Jo9U92GVh-LHfr7PXyjLn2KFWJ3RlqOu-tXFi_HBKCc8NR0za0SIfHzTI9NkfrB3laUfAl7X2rh-0ZOrEcoi1Wa2YWtukYQ        status code: 403, request id: 05662e9a-893b-43d0-89d7-e0b97d4df0e3

找了一圈,发现AWS CLI提供了一个命令来解码这个错误提示
https://aws.amazon.com/premiumsupport/knowledge-center/ec2-not-auth-launch/

执行之后,发现倒是出结果了,但是可读性极差

{    "DecodedMessage": "{\"allowed\":false,\"explicitDeny\":true,\"matchedStatements\":{\"items\":[{\"statementId\":\"\",\"effect\":\"DENY\",\"principals\":{\"items\":[{\"value\":\"AIDA2JFFJMJ7RKEOWPORC\"}]},\"principalGroups\":{\"items\":[]},\"actions\":{\"items\":[{\"value\":\"iam:AttachGroupPolicy\"},{\"value\":\"iam:AttachRolePolicy\"},{\"value\":\"iam:AttachUserPolicy\"},{\"value\":\"iam:ChangePassword\"},{\"value\":\"iam:CreateAccessKey\"},{\"value\":\"iam:CreateInstanceProfile\"},{\"value\":\"iam:CreateLoginProfile\"},{\"value\":\"iam:CreateRole\"},{\"value\":\"iam:CreateUser\"},{\"value\":\"iam:DetachUserPolicy\"},{\"value\":\"iam:PutUserPermissionsBoundary\"},{\"value\":\"iam:PutUserPolicy\"},{\"value\":\"iam:UpdateAccessKey\"},{\"value\":\"iam:UpdateAccountPasswordPolicy\"},{\"value\":\"iam:UpdateUser\"},{\"value\":\"ec2:RequestSpotInstances\"},{\"value\":\"ec2:RunInstances\"},{\"value\":\"ec2:StartInstances\"},{\"value\":\"organizations:CreateAccount\"},{\"value\":\"organizations:CreateOrganization\"},{\"value\":\"organizations:InviteAccountToOrganization\"},{\"value\":\"lambda:CreateFunction\"},{\"value\":\"lightsail:Create*\"},{\"value\":\"lightsail:Start*\"},{\"value\":\"lightsail:Delete*\"},{\"value\":\"lightsail:Update*\"},{\"value\":\"lightsail:GetInstanceAccessDetails\"},{\"value\":\"lightsail:DownloadDefaultKeyPair\"}]},\"resources\":{\"items\":[{\"value\":\"*\"}]},\"conditions\":{\"items\":[]}}]},\"failures\":{\"items\":[]},\"context\":{\"principal\":{\"id\":\"AIDA2JFFJMJ7RKEOWPORC\",\"name\":\"terraform\",\"arn\":\"arn:aws:iam::706868765311:user/terraform\"},\"action\":\"ec2:RunInstances\",\"resource\":\"arn:aws:ec2:ap-southeast-2:706868765311:instance/*\",\"conditions\":{\"items\":[{\"key\":\"ec2:InstanceMarketType\",\"values\":{\"items\":[{\"value\":\"on-demand\"}]}},{\"key\":\"aws:Resource\",\"values\":{\"items\":[{\"value\":\"instance/*\"}]}},{\"key\":\"aws:Account\",\"values\":{\"items\":[{\"value\":\"706868765311\"}]}},{\"key\":\"ec2:AvailabilityZone\",\"values\":{\"items\":[{\"value\":\"ap-southeast-2a\"}]}},{\"key\":\"ec2:ebsOptimized\",\"values\":{\"items\":[{\"value\":\"false\"}]}},{\"key\":\"ec2:IsLaunchTemplateResource\",\"values\":{\"items\":[{\"value\":\"false\"}]}},{\"key\":\"ec2:InstanceType\",\"values\":{\"items\":[{\"value\":\"t2.micro\"}]}},{\"key\":\"ec2:RootDeviceType\",\"values\":{\"items\":[{\"value\":\"ebs\"}]}},{\"key\":\"aws:Region\",\"values\":{\"items\":[{\"value\":\"ap-southeast-2\"}]}},{\"key\":\"aws:Service\",\"values\":{\"items\":[{\"value\":\"ec2\"}]}},{\"key\":\"ec2:InstanceID\",\"values\":{\"items\":[{\"value\":\"*\"}]}},{\"key\":\"aws:Type\",\"values\":{\"items\":[{\"value\":\"instance\"}]}},{\"key\":\"ec2:Tenancy\",\"values\":{\"items\":[{\"value\":\"default\"}]}},{\"key\":\"ec2:Region\",\"values\":{\"items\":[{\"value\":\"ap-southeast-2\"}]}},{\"key\":\"aws:ARN\",\"values\":{\"items\":[{\"value\":\"arn:aws:ec2:ap-southeast-2:706868765311:instance/*\"}]}}]}}}"}

通过jq 和 sed 重新整理一下

cat output.json | jq -r '.["DecodedMessage"]' |sed 's/\\"/"/g' |jq .

最后的结果

仔细看了看,他使用了某一个IAM的账号来进行访问,然后这个账号并无权限创建EC2。 原来这是我很早之前做测试的时候 手动配置了一个aws configuration,因此他使用的账号始终是这个IAM用户而不是我的Role权限。

第二个有趣的问题是,我的跳板机和内网服务器都跑起来了,那么正常情况我需要SSH到跳板机上,然后再SSH到我的服务器上。我本地有个私钥,SSH到跳板机没问题,问题是我怎么把私钥放到跳板机上,这样他才能SSH到内网服务器呢?

刚开始我想的是用terraform的 local-exec 里面执行scp 拷贝私钥过去,后来发现了一个更好的方式 SSH Proxycommand。

我只需要在本地配置 ~/.ssh/config 就可以了。

配置文件如下:

[ec2-user@ip-172-31-9-120 task1]$ cat ~/.ssh/configHost jumpbox Hostname 3.24.55.177 ForwardAgent yes User ec2-userHost App Hostname 10.0.2.53 User ec2-user ProxyCommand ssh -W %h:%p jumpbox

然后我直接 ssh ec2-user@App 就可以直接通过跳板机连接到内网服务器了!

©著作权归作者所有:来自51CTO博客作者beanxyz的原创作品,如需转载,请注明出处,否则将追究法律责任

每一份赞赏源于懂得

赞赏

0人进行了赞赏支持

更多相关文章

  1. 网站使用云服务器有什么好处?
  2. WEB服务器参数优化配置模版
  3. Linux主要应用范围有哪些?Linux学习
  4. 自动修改centos服务器IP地址
  5. 手把手从0开始教你搭建Jumpserver,为服务器安全保驾护航!
  6. 大规模分布式系统资源管理(一)
  7. 强大!Nginx 配置在线一键生成“神器”
  8. Ajax异步请求PHP服务器,如何做到无阻塞响应 原创 学习与分享 PH
  9. Exchange2016和2019的架构分享

随机推荐

  1. 找出数组中大于或等于N的数
  2. 对于PHP中enum的好奇
  3. redis界面管理工具phpRedisAdmin 安装
  4. 分支复位组的反向引用
  5. php不重新编译添加模块 php不重新编译添
  6. PHP万能密码登陆
  7. php 7-177之间能被7整除的总和的平均数
  8. php如何跨站抓取别的站点的页面的补充
  9. 如何让Netbeans调试器暂停每个新的php文
  10. 执行以下查询时出错