На виртуальных машинах должен быть установлен пакет cloud-init. После запуска виртуальной машины должны быть запущены следующие службы, связанные с этим пакетом:

  • cloud-config.service;
  • cloud-final.service;
  • cloud-init.service.

Для работы cloud-provider и machine-controller-manager требуется доступ в API AWS из-под IAM-пользователя, который обладает достаточным набором прав.

Убедитесь в наличии доступа к нужному региону и наличии необходимых квот.

JSON-спецификация Policy

Сначала подготовьте JSON-файл с конфигурацией необходимых прав:

1{
2    "Version": "2012-10-17",
3    "Statement": [
4        {
5            "Sid": "VisualEditor0",
6            "Effect": "Allow",
7            "Action": [
8                "autoscaling:DescribeAutoScalingGroups",
9                "autoscaling:DescribeLaunchConfigurations",
10                "autoscaling:DescribeTags",
11                "ec2:AllocateAddress",
12                "ec2:AssociateAddress",
13                "ec2:AssociateRouteTable",
14                "ec2:AttachInternetGateway",
15                "ec2:AttachVolume",
16                "ec2:AuthorizeSecurityGroupEgress",
17                "ec2:AuthorizeSecurityGroupIngress",
18                "ec2:CreateInternetGateway",
19                "ec2:CreateKeyPair",
20                "ec2:CreateNATGateway",
21                "ec2:CreateRoute",
22                "ec2:CreateRouteTable",
23                "ec2:CreateSecurityGroup",
24                "ec2:CreateSubnet",
25                "ec2:CreateTags",
26                "ec2:CreateVolume",
27                "ec2:CreateVpc",
28                "ec2:DeleteInternetGateway",
29                "ec2:DeleteKeyPair",
30                "ec2:DeleteNATGateway",
31                "ec2:DeleteRoute",
32                "ec2:DeleteRouteTable",
33                "ec2:DeleteSecurityGroup",
34                "ec2:DeleteSubnet",
35                "ec2:DeleteTags",
36                "ec2:DeleteVolume",
37                "ec2:DeleteVpc",
38                "ec2:DescribeAccountAttributes",
39                "ec2:DescribeAddresses",
40                "ec2:DescribeAvailabilityZones",
41                "ec2:DescribeImages",
42                "ec2:DescribeInstanceAttribute",
43                "ec2:DescribeInstanceCreditSpecifications",
44                "ec2:DescribeInstances",
45                "ec2:DescribeInstanceTypes",
46                "ec2:DescribeInternetGateways",
47                "ec2:DescribeKeyPairs",
48                "ec2:DescribeNatGateways",
49                "ec2:DescribeNetworkInterfaces",
50                "ec2:DescribeRegions",
51                "ec2:DescribeRouteTables",
52                "ec2:DescribeSecurityGroups",
53                "ec2:DescribeSecurityGroupRules",
54                "ec2:DescribeSubnets",
55                "ec2:DescribeTags",
56                "ec2:DescribeVolumesModifications",
57                "ec2:DescribeVolumes",
58                "ec2:DescribeVpcAttribute",
59                "ec2:DescribeVpcClassicLink",
60                "ec2:DescribeVpcClassicLinkDnsSupport",
61                "ec2:DescribeVpcs",
62                "ec2:DetachInternetGateway",
63                "ec2:DetachVolume",
64                "ec2:DisassociateAddress",
65                "ec2:DisassociateRouteTable",
66                "ec2:ImportKeyPair",
67                "ec2:ModifyInstanceAttribute",
68                "ec2:ModifySubnetAttribute",
69                "ec2:ModifyVolume",
70                "ec2:ModifyVpcAttribute",
71                "ec2:ReleaseAddress",
72                "ec2:RevokeSecurityGroupEgress",
73                "ec2:RevokeSecurityGroupIngress",
74                "ec2:RunInstances",
75                "ec2:TerminateInstances",
76                "ec2:DescribeVpcPeeringConnections",
77                "ec2:CreateVpcPeeringConnection",
78                "ec2:DeleteVpcPeeringConnection",
79                "ec2:AcceptVpcPeeringConnection",
80                "ec2:CreateNetworkInterface",
81                "ec2:DescribeNetworkInterfaceAttribute",
82                "ec2:ModifyNetworkInterfaceAttribute",
83                "ec2:DeleteNetworkInterface",
84                "ec2:DescribeNetworkInterfaces",                
85                "elasticloadbalancing:AddTags",
86                "elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
87                "elasticloadbalancing:AttachLoadBalancerToSubnets",
88                "elasticloadbalancing:ConfigureHealthCheck",
89                "elasticloadbalancing:CreateListener",
90                "elasticloadbalancing:CreateLoadBalancer",
91                "elasticloadbalancing:CreateLoadBalancerListeners",
92                "elasticloadbalancing:CreateLoadBalancerPolicy",
93                "elasticloadbalancing:CreateTargetGroup",
94                "elasticloadbalancing:DeleteListener",
95                "elasticloadbalancing:DeleteLoadBalancer",
96                "elasticloadbalancing:DeleteLoadBalancerListeners",
97                "elasticloadbalancing:DeleteTargetGroup",
98                "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
99                "elasticloadbalancing:DeregisterTargets",
100                "elasticloadbalancing:DescribeListeners",
101                "elasticloadbalancing:DescribeLoadBalancerAttributes",
102                "elasticloadbalancing:DescribeLoadBalancerPolicies",
103                "elasticloadbalancing:DescribeLoadBalancers",
104                "elasticloadbalancing:DescribeTargetGroups",
105                "elasticloadbalancing:DescribeTargetHealth",
106                "elasticloadbalancing:DetachLoadBalancerFromSubnets",
107                "elasticloadbalancing:ModifyListener",
108                "elasticloadbalancing:ModifyLoadBalancerAttributes",
109                "elasticloadbalancing:ModifyTargetGroup",
110                "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
111                "elasticloadbalancing:RegisterTargets",
112                "elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer",
113                "elasticloadbalancing:SetLoadBalancerPoliciesOfListener",
114                "iam:AddRoleToInstanceProfile",
115                "iam:CreateInstanceProfile",
116                "iam:CreateRole",
117                "iam:CreateServiceLinkedRole",
118                "iam:DeleteInstanceProfile",
119                "iam:DeleteRole",
120                "iam:DeleteRolePolicy",
121                "iam:GetInstanceProfile",
122                "iam:GetRole",
123                "iam:GetRolePolicy",
124                "iam:ListInstanceProfilesForRole",
125                "iam:ListRolePolicies",
126                "iam:ListAttachedRolePolicies",
127                "iam:PassRole",
128                "iam:PutRolePolicy",
129                "iam:RemoveRoleFromInstanceProfile",
130                "iam:TagRole",
131                "kms:DescribeKey",
132                "sts:GetCallerIdentity"
133            ],
134            "Resource": "*"
135        }
136    ]
137}

Инструкции, как применить этот JSON-файл, ниже.

Настройка IAM через веб-интерфейс

Чтобы настроить IAM через веб-интерфейс, сначала создайте новую политику (Policy) и примените к ней созданный ранее JSON-файл:

  1. Откройте Identity and Access Management (IAM).
  2. Перейдите в раздел Policies и нажмите Create Policy.
  3. Выберите вкладку JSON и вставьте приведенную выше спецификацию.
  4. Нажмите Next: Tags, затем Next: Review.
  5. Задайте название политики в поле Name (например, D8CloudProviderAWS).
  6. Нажмите Create Policy.

Затем добавьте нового пользователя:

  1. Перейдите в раздел Users IAM и нажмите Add users.
  2. Задайте имя в поле User name (например, deckhouse).

Примените к нему созданную Policy:

  1. В разделе Select AWS credential type выберите Access key - Programmatic access.
  2. Нажмите Next: Permissions.
  3. Выберите вкладку Attach existing policies directly.
  4. Введите в поле поиска (Filter policies) имя политики, указанное на предыдущих шагах (например, D8CloudProviderAWS), и в полученном списке отметьте checkbox напротив искомой политики.
  5. Нажмите Next: Tags, затем Next: Review.
  6. Нажмите Create user.

Сохраните полученные Access key ID и Secret access key.

Проверьте, есть ли у вашей учетной записи (и, соответственно, у созданного пользователя) доступ к нужным регионам. Для этого выберите необходимый регион в выпадающем списке в правом верхнем углу.

Если произойдет переключение в выбранный регион, доступ к региону есть.

Если доступа к региону нет, вы получите следующее сообщение (может отличаться):

Разрешить использование региона

В этом случае нажмите Continue, чтобы разрешить использование региона.

Настройка IAM через CLI

Также IAM можно настроить через интерфейс командной строки.

Для этого с помощью следующей команды сохраните JSON-спецификацию в файл policy.json:

1cat > policy.json << EOF
2<Policy JSON spec>
3EOF

Затем создайте новую Policy с именем D8CloudProviderAWS и примечанием ARN, используя JSON-спецификацию из файла policy.json:

1aws iam create-policy --policy-name D8CloudProviderAWS --policy-document file://policy.json

В ответ отобразится следующий текст:

1{
2    "Policy": {
3        "PolicyName": "D8CloudProviderAWS",
4        "PolicyId": "AAA",
5        "Arn": "arn:aws:iam::123:policy/D8CloudProviderAWS",
6        "Path": "/",
7        "DefaultVersionId": "v1",
8        "AttachmentCount": 0,
9        "PermissionsBoundaryUsageCount": 0,
10        "IsAttachable": true,
11        "CreateDate": "2020-08-27T02:52:06+00:00",
12        "UpdateDate": "2020-08-27T02:52:06+00:00"
13    }
14}

Создайте нового пользователя:

1aws iam create-user --user-name deckhouse

В ответ отобразится следующий текст:

1{
2    "User": {
3        "Path": "/",
4        "UserName": "deckhouse",
5        "UserId": "AAAXXX",
6        "Arn": "arn:aws:iam::123:user/deckhouse",
7        "CreateDate": "2020-08-27T03:05:42+00:00"
8    }
9}

Разрешите доступ к API и сохраните пару AccessKeyId + SecretAccessKey:

1aws iam create-access-key --user-name deckhouse

В ответ отобразится следующий текст:

1{
2    "AccessKey": {
3        "UserName": "deckhouse",
4        "AccessKeyId": "XXXYYY",
5        "Status": "Active",
6        "SecretAccessKey": "ZZZzzz",
7        "CreateDate": "2020-08-27T03:06:22+00:00"
8    }
9}

Объедините User и Policy:

1aws iam attach-user-policy --user-name username --policy-arn arn:aws:iam::123:policy/D8CloudProviderAWS

Настройка IAM через Terraform

Пример настройки IAM через Terraform:

1resource "aws_iam_user" "user" {
2  name = "deckhouse"
3}
4resource "aws_iam_access_key" "user" {
5  user = aws_iam_user.user.name
6}
7resource "aws_iam_policy" "policy" {
8  name        = "D8CloudProviderAWS"
9  path        = "/"
10  description = "Deckhouse policy"
11  policy = <<EOF
12<JSON-спецификация Policy>
13EOF
14}
15resource "aws_iam_user_policy_attachment" "policy-attachment" {
16  user       = aws_iam_user.user.name
17  policy_arn = aws_iam_policy.policy.arn
18}