Um registro de solução de problemas do Terraform

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

Um registro de solução de problemas do Terraform

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!

Acho que você gosta

Origin blog.51cto.com/beanxyz/2668521
Recomendado
Clasificación