Hoje escrevi um pequeno exercício para o Terraform. O conteúdo é muito simples. Crie um VPC por meio de recursos. A rede pública é um trampolim e a rede privada é um servidor interno. Após a configuração, você pode acessar o servidor de rede interna por meio do trampolim .
O conteúdo escrito está aqui.
https://github.com/beanxyz/task1
Este conteúdo é relativamente básico, então não o repetirei. Nesse processo, encontrei dois problemas interessantes, portanto, registre-os.
O primeiro problema é que quando eu executo o terraform apply, quando ele começa a criar EC2, um erro é reportado
À primeira vista, esse erro parece ser um problema de permissão, mas meu servidor terraform é um EC2 e, obviamente, dei a essa função permissão suficiente para executar operações.
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
Depois de dar uma olhada, descobri que o AWS CLI fornece um comando para decodificar essa mensagem de erro
https://aws.amazon.com/premiumsupport/knowledge-center/ec2-not-auth-launch/
Após a execução, verificou-se que os resultados foram obtidos, mas a legibilidade era extremamente pobre
{
"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/*\"}]}}]}}}"
}
Reorganizar por meio de jq e sed
cat output.json | jq -r '.["DecodedMessage"]' |sed 's/\\"/"/g' |jq .
Resultado final
Depois de olhar mais de perto, ele usou uma determinada conta IAM para acessar e, em seguida, essa conta não tinha permissão para criar EC2. Acontece que esta é uma configuração manual de uma configuração de aws quando eu estava fazendo o teste há muito tempo, então a conta que ele usou é sempre o usuário IAM em vez de minha permissão de função.
O segundo problema interessante é que meu servidor springboard e intranet estão funcionando, então, em circunstâncias normais, preciso fazer o SSH para o springboard e depois SSH para o meu servidor. Eu tenho uma chave privada localmente. Está tudo bem para SSH para o trampolim. A questão é como faço para colocar a chave privada no trampolim para que ele possa SSH para o servidor de intranet?
A princípio pensei em usar o local-exec do terraform para executar o scp para copiar a chave privada. Mais tarde, descobri uma maneira melhor de usar o SSH Proxycommand.
Eu só preciso configurar ~ / .ssh / config localmente.
O arquivo de configuração é o seguinte:
[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
Então, posso usar o ssh ec2-user @ App diretamente para me conectar ao servidor da intranet por meio do trampolim!