На виртуальных машинах должен быть установлен пакет 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-файл:
- Откройте
Identity and Access Management (IAM)
. - Перейдите в раздел
Policies
и нажмитеCreate Policy
. - Выберите вкладку
JSON
и вставьте приведенную выше спецификацию. - Нажмите
Next: Tags
, затемNext: Review
. - Задайте название политики в поле
Name
(например,D8CloudProviderAWS
). - Нажмите
Create Policy
.
Затем добавьте нового пользователя:
- Перейдите в раздел
Users
IAM и нажмитеAdd users
. - Задайте имя в поле
User name
(например,deckhouse
).
Примените к нему созданную Policy:
- В разделе
Select AWS credential type
выберитеAccess key - Programmatic access
. - Нажмите
Next: Permissions
. - Выберите вкладку
Attach existing policies directly
. - Введите в поле поиска (
Filter policies
) имя политики, указанное на предыдущих шагах (например,D8CloudProviderAWS
), и в полученном списке отметьте checkbox напротив искомой политики. - Нажмите
Next: Tags
, затемNext: Review
. - Нажмите
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}