Чтобы в #ECS скопировать #task_definition через JSON и потом вставить это при создании другой #task_definition (т.е. сделать условный экспорт-импорт в консоли) - нужно удалить в полученном (скопированном) JSON следующие переменные:
Иначе #error: Should only contain "family", "containerDefinitions", "volumes", "taskRoleArn", "networkMode", "placementConstraints", "requiresCompatibilities", "cpu", "memory", "executionRoleArn".
compatibilities
requiresAttributes
taskDefinitionArn
revision
statusИначе #error: Should only contain "family", "containerDefinitions", "volumes", "taskRoleArn", "networkMode", "placementConstraints", "requiresCompatibilities", "cpu", "memory", "executionRoleArn".
#recommendation - периодически обновлять #AMI (в т.ч. докерных образов, как минимум сервисного) - раз в квартал (так обычно выходят обновления Amazon Linux).
Для срочных патчей (очередная критическая уязвимость чего бы то ни было) - отработать процедуру запуска критических обновлений.
Для срочных патчей (очередная критическая уязвимость чего бы то ни было) - отработать процедуру запуска критических обновлений.
#issue При обновлении #AMI для #ECS Autoscaling group через шаблон - есть проблема для действующих #prod систем. #CloudFormation не учитывает скорости деплоя убиваемых докеров (#task_definition) - новые инстансы (с обновлённым AMI) поднимаются очень быстро и как только они становятся доступными, предыдущие (ещё работающие с набитыми докерами) тупо терминируются. В результате появляется #downtime - пока на поднявшиеся новые инстансы задеплоятся убитые вместе с инстансами докеры.
Обсуждение этой проблемы на Reddit.
Обсуждение этой проблемы на Reddit.
reddit
Refreshing an Amazon ECS Container Instance Cluster With a New AMI
Posted in r/aws by u/scarhill • 29 points and 12 comments
Когда в #CloudFormation #templates нужно иметь переменное количество параметров, то можно использовать Fn::Transform:
#transform можно использовать и для отдельных параметров и для блоков.
Targets:
- Id: !Ref SwarmMaster
Port: 888
- Id: !Ref SwarmWorker1
Port: 888
Fn::Transform:
Name: AWS::Include
Parameters:
Location: !If [ IsProd, !Ref ProdS3linkToYaml, !Ref DevS3linkToYaml ]#transform можно использовать и для отдельных параметров и для блоков.
Amazon
AWS::Include transform - AWS CloudFormation
Learn about how to create reusable Transform function snippets and include them in one or more AWS CloudFormation templates using the AWS::Include transform.
#recommendation Для важных (неочевидных, а для кого-то - просто всех) выходных переменных #CloudFormation #templates стоит добавлять описание:
Outputs:
## Common parameters
dnsKong:
Value: !Ref dnsKong
Description: Kong External ELB DNS
Export:
Name: dnsKongОбщий способ добавления в шаблон #vpc_endpoint (без политик):
#CloudFormation #templates
vpcEndpointS3:
Type: AWS::EC2::VPCEndpoint
Properties:
VpcId: !ImportValue vpc4
ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3'
RouteTableIds:
- !ImportValue rtbVpc4Dmz
- !ImportValue rtbVpc4Private#CloudFormation #templates
Если добавлять #vpc_endpoints на что-то (с политиками), например, лишь для загрузки пакетов для обновления #AMI (), то вид следующий:
#CloudFormation #templates
vpcEndpointS3:
Type: AWS::EC2::VPCEndpoint
Properties:
VpcId: !ImportValue vpc4
ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3'
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal: '*'
Action:
- 's3:GetObject'
Resource:
- 'arn:aws:s3:::packages.*.amazonaws.com/*'
- 'arn:aws:s3:::repo.*.amazonaws.com/*'
RouteTableIds:
- !ImportValue rtbVpc4Dmz
- !ImportValue rtbVpc4Private#CloudFormation #templates
Amazon
Amazon Linux AMI FAQs
Для #vpc_endpoint типа Gateway не требуется PrivateDnsEnabled, его указывать не нужно (иначе будет #error).
Также #vpc_endpoint типа Gateway требует RouteTableIds и работает лишь с ним (указание SubnetIds и/или SecurityGroupIds даст #error). В то время как для #vpc_endpoint типа Interface, наоборот, требуется SubnetIds и/или SecurityGroupIds:
Указывать несколько SubnetIds из одной подзоны нельзя (иначе будет #error), потому можно указать лишь Security Group (например, пустую - заглушку). Хотя можно и то, и другое.
#CloudFormation #templates
vpcEndpointDynamoDb:
Type: AWS::EC2::VPCEndpoint
Properties:
VpcId: !ImportValue vpc4
ServiceName: !Sub 'com.amazonaws.${AWS::Region}.dynamodb'
RouteTableIds:
- !ImportValue rtbVpc4Dmz
- !ImportValue rtbVpc4PrivateТакже #vpc_endpoint типа Gateway требует RouteTableIds и работает лишь с ним (указание SubnetIds и/или SecurityGroupIds даст #error). В то время как для #vpc_endpoint типа Interface, наоборот, требуется SubnetIds и/или SecurityGroupIds:
vpcEndpointEc2Messages:
Type: AWS::EC2::VPCEndpoint
Properties:
VpcId: !ImportValue vpc4
ServiceName: !Sub 'com.amazonaws.${AWS::Region}.ec2messages'
PrivateDnsEnabled: true
VpcEndpointType: Interface
SubnetIds:
- !ImportValue subnetVpc4PrivateAppA
- !ImportValue subnetVpc4PrivateAppB
SecurityGroupIds:
- !ImportValue sgVpc4DummyУказывать несколько SubnetIds из одной подзоны нельзя (иначе будет #error), потому можно указать лишь Security Group (например, пустую - заглушку). Хотя можно и то, и другое.
#CloudFormation #templates
ReadOnly #bucket_policy для доступа к файлам/бакету из других аккаунтов ("расширенная версия" - не забываем добавлять ListBucket для возможности копировать с профиксом/рекурсией, а также GetBucketLocation для определения региона бакета):
#s3 #cross_account #access
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Access to files/* for accounts: dev1, dev2",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::111111111111:root",
"arn:aws:iam::222222222222:root"
]
},
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::shared-bucket/files/*",
"arn:aws:s3:::shared-bucket"
]
}
]
}#s3 #cross_account #access
Пример экономии при использовании #vpc_endpoint для #s3.
Если коротко, то при использовании приватных подсетей, когда исходящий трафик идёт через NAT GW - через него же идут запросы к сервисам амазона, в частности, #s3, что тарифицируется (т.к. "выходит в интернет" как обычный https запрос). Чтобы такого не происходило, стоит поднимать #vpc_endpoint и тогда трафик будет внутренним (не будет "выходить в интернет").
#cost_saving
Если коротко, то при использовании приватных подсетей, когда исходящий трафик идёт через NAT GW - через него же идут запросы к сервисам амазона, в частности, #s3, что тарифицируется (т.к. "выходит в интернет" как обычный https запрос). Чтобы такого не происходило, стоит поднимать #vpc_endpoint и тогда трафик будет внутренним (не будет "выходить в интернет").
#cost_saving
Medium
Save Money with AWS VPC Endpoints
Part of my job is to keep the AWS costs down as much as possible. I tend to review the use of our AWS resources on a daily basis and then…
Визуализация ресурсов #AWS:
- https://cloudcraft.co (постоянно пользуюсь - простой, понятный, но мало типов ресурсов)
- https://totalcloud.io
- https://duo.com/blog/introducing-cloudmapper-an-aws-visualization-tool
#visualisation
- https://cloudcraft.co (постоянно пользуюсь - простой, понятный, но мало типов ресурсов)
- https://totalcloud.io
- https://duo.com/blog/introducing-cloudmapper-an-aws-visualization-tool
#visualisation
www.cloudcraft.co
Cloudcraft – Draw AWS diagrams
Visualize your AWS environment as isometric architecture diagrams. Snap together blocks for EC2s, ELBs, RDS and more. Connect your live AWS environment.
Разложенные по применению бакет или
То есть, чтобы не ошибиться и не получить #error "Action does not apply to any resource(s) in statement", которая появляется из-за того, что требуется операция к чисто бакету, а не
/* #s3 операции.То есть, чтобы не ошибиться и не получить #error "Action does not apply to any resource(s) in statement", которая появляется из-за того, что требуется операция к чисто бакету, а не
/*, лучше всегда использовать в ресурсах:"Resource": [
"arn:aws:s3:::some-bucket/*",
"arn:aws:s3:::some-bucket"
]
Amazon
Amazon S3 actions - Amazon Simple Storage Service
How to specify permissions for Amazon S3 actions in a policy.