Terraform的一次排错记录

今天写了个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 .

最后的结果

Terraform的一次排错记录

仔细看了看,他使用了某一个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/config
Host jumpbox
 Hostname 3.24.55.177
 ForwardAgent yes
 User ec2-user
Host App
 Hostname 10.0.2.53
 User ec2-user
 ProxyCommand ssh -W %h:%p jumpbox

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

猜你喜欢

转载自blog.51cto.com/beanxyz/2668521