en
Feedback
AWS Notes

AWS Notes

Open in Telegram

AWS Notes — Amazon Web Services Educational and Information Channel Chat: https://t.me/aws_notes_chat Contacts: @apple_rom, https://www.linkedin.com/in/roman-siewko/ No ads.

Show more
5 802
Subscribers
-324 hours
-87 days
-330 days
Posts Archive
Разложенные по применению бакет или /* #s3 операции. То есть, чтобы не ошибиться и не получить #error "Action does not apply to any resource(s) in statement", которая появляется из-за того, что требуется операция к чисто бакету, а не /*, лучше всегда использовать в ресурсах:
            "Resource": [
                "arn:aws:s3:::some-bucket/*",
                "arn:aws:s3:::some-bucket"
            ]

Визуализация ресурсов #AWS: - https://cloudcraft.co (постоянно пользуюсь - простой, понятный, но мало типов ресурсов) - https://totalcloud.io - https://duo.com/blog/introducing-cloudmapper-an-aws-visualization-tool #visualisation

Сервисы #AWS по их наличию в регионах. #aws_region

Полезный шаблон шифрованного #ES в #VPC. #CloudFormation #templates

На данный момент через #CloudFormation нельзя создавать #ES в #VPC, нужно предварительно создать #IAM #role, для этого выполнить #aws_cli:
aws iam create-service-linked-role --aws-service-name es.amazonaws.com

Пример экономии при использовании #vpc_endpoint для #s3. Если коротко, то при использовании приватных подсетей, когда исходящий трафик идёт через NAT GW - через него же идут запросы к сервисам амазона, в частности, #s3, что тарифицируется (т.к. "выходит в интернет" как обычный https запрос). Чтобы такого не происходило, стоит поднимать #vpc_endpoint и тогда трафик будет внутренним (не будет "выходить в интернет"). #cost_saving

ReadOnly #bucket_policy для доступа к файлам/бакету из других аккаунтов ("расширенная версия" - не забываем добавлять ListBucket для возможности копировать с профиксом/рекурсией, а также GetBucketLocation для определения региона бакета): { "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 типа Gateway не требуется PrivateDnsEnabled, его указывать не нужно (иначе будет #error). 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

Если добавлять #vpc_endpoints на что-то (с политиками), например, лишь для загрузки пакетов для обновления #AMI (), то вид следующий: 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

Общий способ добавления в шаблон #vpc_endpoint (без политик): vpcEndpointS3: Type: AWS::EC2::VPCEndpoint Properties: VpcId: !ImportValue vpc4 ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3' RouteTableIds: - !ImportValue rtbVpc4Dmz - !ImportValue rtbVpc4Private #CloudFormation #templates

#recommendation Для важных (неочевидных, а для кого-то - просто всех) выходных переменных #CloudFormation #templates стоит добавлять описание: Outputs: ## Common parameters dnsKong: Value: !Ref dnsKong Description: Kong External ELB DNS Export: Name: dnsKong

Когда в #CloudFormation #templates нужно иметь переменное количество параметров, то можно использовать Fn::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 можно использовать и для отдельных параметров и для блоков.

Удобный каталог типов инстансов #ec2 с параметрами https://ec2instances.info/ #info #comparison

Slack Bot
Slack Bot

Slack Bot на Лямбде. #slack #bot #lambda

#issue При обновлении #AMI для #ECS Autoscaling group через шаблон - есть проблема для действующих #prod систем. #CloudFormation не учитывает скорости деплоя убиваемых докеров (#task_definition) - новые инстансы (с обновлённым AMI) поднимаются очень быстро и как только они становятся доступными, предыдущие (ещё работающие с набитыми докерами) тупо терминируются. В результате появляется #downtime - пока на поднявшиеся новые инстансы задеплоятся убитые вместе с инстансами докеры. Обсуждение этой проблемы на Reddit.

#recommendation - периодически обновлять #AMI (в т.ч. докерных образов, как минимум сервисного) - раз в квартал (так обычно выходят обновления Amazon Linux). Для срочных патчей (очередная критическая уязвимость чего бы то ни было) - отработать процедуру запуска критических обновлений.

Чтобы в #ECS скопировать #task_definition через JSON и потом вставить это при создании другой #task_definition (т.е. сделать условный экспорт-импорт в консоли) - нужно удалить в полученном (скопированном) JSON следующие переменные: compatibilities requiresAttributes taskDefinitionArn revision status Иначе #error: Should only contain "family", "containerDefinitions", "volumes", "taskRoleArn", "networkMode", "placementConstraints", "requiresCompatibilities", "cpu", "memory", "executionRoleArn".

Отправляем VPC flow logs в ES. #vpc #logs #vpc_flow_logs #ES

CI/CD на Лямбде. #CI_CD #lambda