У меня есть шаблон CloudFormation, который я использую для настройки кластера ECS, и я пытаюсь сбросить некоторые файлы конфигурации в ящик с помощью CloudFormation :: Init на ASG и вытащить их из S3.
"ECSASGLaunchConfiguration": {
"Type": "AWS::AutoScaling::LaunchConfiguration",
"Metadata": {
"AWS::CloudFormation::Authentication": {
"S3AccessCreds": {
"type": "S3",
"roleName": {
"Ref": "ECSEC2InstanceIAMRole"
}
}
},
"AWS::CloudFormation::Init": {
"config": {
"packages": {
},
"groups": {
},
"users": {
},
"sources": {
},
"files": {
"/etc/dd-agent/conf.d/nginx.yaml": {
"source": "https://s3.amazonaws.com/foobar/scratch/nginx.yaml",
"mode": "000644",
"owner": "root",
"group": "root"
},
"/etc/dd-agent/conf.d/docker_daemon.yaml": {
"source": "https://s3.amazonaws.com/foobar/scratch/docker_daemon.yaml",
"mode": "000644",
"owner": "root",
"group": "root"
}
},
"commands": {
},
"services": {
}
}
}
},
Для этого я добавил встроенную политику в роль, которую я создаю для своих экземпляров EC2, которая должна разрешать всем доступ к S3 из экземпляров.
"ECSEC2InstanceIAMRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"ec2.amazonaws.com"
]
},
"Action": [
"sts:AssumeRole"
]
}
]
},
"ManagedPolicyArns": [
"arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role",
"arn:aws:iam::aws:policy/CloudWatchLogsFullAccess"
],
"Path": "/",
"Policies": [
{
"PolicyName": "otxS3access",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::foobar"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::foobar/*"
}
]
}
}
]
}
},
"ECSEC2InstanceIAMProfile": {
"Type": "AWS::IAM::InstanceProfile",
"Properties": {
"Path": "/",
"Roles": [
{
"Ref": "ECSEC2InstanceIAMRole"
}
]
}
},
Но не работает. Я не могу найти ошибку (или что-то еще) в журналах. Когда я вручную пытаюсь скрутить его из экземпляра, это тоже не работает ",AccessDenied
... "
Сама корзина в данном случае, «foobar», не имеет каких-либо специальных разрешений, кроме того, что она не является общедоступной, а только стандартное имя учетной записи единственного получателя.
Есть идеи, что я делаю не так?
Я обнаружил проблему. Вся эта CloudFormation в вопросе в порядке и делает то, что должна. Проблема заключалась в том, что я запускал cfn-init в пользовательских данных экземпляра, настроенных в конфигурации запуска ASG - это не работало, поэтому не выполнялось содержимое init. Благодаря @ Rob-d ваши комментарии привели меня к уровню исполняемых файлов.
Другая волшебная часть, которая заставляет все это работать:
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"",
[
"#!/bin/bash\n",
"cat > /etc/ecs/ecs.config <<EOF\n",
"ECS_CLUSTER=",
{
"Ref": "ECSCluster"
},
"\n",
"ECS_ENGINE_AUTH_TYPE=docker\n",
"ECS_ENGINE_AUTH_DATA={REDACTED}\n",
"EOF\n",
"yum -y install aws-cfn-bootstrap\n",
"# Install the files and packages from the metadata\n",
"/opt/aws/bin/cfn-init -v ",
" --stack ",
{
"Ref": "AWS::StackName"
},
" --resource ECSASGLaunchConfiguration ",
" --region ",
{
"Ref": "AWS::Region"
},
"\n",
"/opt/aws/bin/cfn-signal -e -0 ",
" --stack ",
{
"Ref": "AWS::StackName"
},
" --resource ECSAutoScalingGroup ",
" --region ",
{
"Ref": "AWS::Region"
},
"\n",
"\n"
]
]
}
}