Я использую пользовательский ресурс CloudFormation для создания пары ключей EC2 для автоматической установки. Я пытаюсь удалить как можно больше ручных шагов для высокоавтоматизированной настройки сервера. Вот часть шаблона CloudFormation с соответствующим кодом:
LambdaRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Action:
- sts:AssumeRole
Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
LambdaPolicy:
Type: AWS::IAM::Policy
DependsOn:
- LambdaRole
Properties:
PolicyName: CFNCustomSecretProviderPolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- iam:CreateAccessKey
- iam:DeleteAccessKey
- iam:UpdateAccessKey
- ssm:PutParameter
- ssm:GetParameter
- ssm:DeleteParameter
- ec2:ImportKeyPair
- ec2:DeleteKeyPair
Resource:
- '*'
- Effect: Allow
Action:
- kms:Encrypt
Resource:
- '*'
- Action:
- logs:*
Resource: arn:aws:logs:*:*:*
Effect: Allow
Roles:
- !Ref 'LambdaRole'
CFNSecretProvider:
Type: AWS::Lambda::Function
DependsOn:
- LambdaPolicy
Properties:
Description: CloudFormation Custom:Secret implementation
Code:
S3Bucket: !Sub 'binxio-public-${AWS::Region}'
S3Key: lambdas/cfn-secret-provider-0.11.0.zip
Handler: secrets.handler
MemorySize: 128
Timeout: 30
Role: !GetAtt 'LambdaRole.Arn'
Runtime: python2.7
PrivateKey:
Type: Custom::RSAKey
DependsOn: CFNSecretProvider
Properties:
Name: /mainframe/onyx-private-key
KeyAlias: alias/aws/ssm
ServiceToken: !Join
- ":"
- - arn:aws:lambda
- !Ref "AWS::Region"
- !Ref "AWS::AccountId"
- !Ref CFNSecretProvider
CustomKeyPair:
Type: Custom::KeyPair
DependsOn:
- CFNSecretProvider
- PrivateKey
Properties:
Name: CustomKeyPair
PublicKeyMaterial: !GetAtt
- PrivateKey
- PublicKey
ServiceToken: !Join
- ":"
- - arn:aws:lambda
- !Ref "AWS::Region"
- !Ref "AWS::AccountId"
- !Ref CFNSecretProvider
EC2Instance:
Type: AWS::EC2::Instance
DependsOn:
- CustomKeyPair
- InstanceProfile
Properties:
IamInstanceProfile: !Ref InstanceProfile
InstanceType: !Ref InstanceType
ImageId: !FindInMap [AWSRegionToAMI, !Ref "AWS::Region", AMI]
KeyName: !Ref CustomKeyPair
...
Все в этом, кажется, прекрасно работает, пока не будет создан экземпляр. Он терпит неудачу, утверждая, что пара ключей не существует, даже несмотря на то, что пара ключей существует после ее запуска, и я могу запросить ее:
∴ aws ec2 describe-key-pairs --region=us-east-2 --profile=mainframe-
personal
{
"KeyPairs": [
{
"KeyFingerprint": "90:42:11:40:a5:9b:66:af:78:ce:b4:d1:54:07:95:27",
"KeyName": "CustomKeyPair"
},
{
"KeyFingerprint": "27:5c:bf:4a:b2:f6:75:3b:8c:c3:1b:57:0d:7e:28:de:8e:cd:90:69",
"KeyName": "default"
}
]
}
Ошибка, которую я получаю в журнале событий CloudFormation: Пара ключей 'arn: aws: ec2: us-east-2: 685716241758: keypair / CustomKeyPair' не существует . Именно ARN это именно то, что показано в списке ресурсов. Есть ли какая-то причина, по которой CloudFormation не может найти эту пару ключей?