AWS Notes
5.6K subscribers
444 photos
42 videos
10 files
2.8K links
AWS Notes — Amazon Web Services Educational and Information Channel

Chat: https://xn--r1a.website/aws_notes_chat

Contacts: @apple_rom, https://www.linkedin.com/in/roman-siewko/
Download Telegram
#CloudFront нельзя завести на #internal #LoadBalancer, т.к. он не умеет (не может) работать с элементами в #VPC, потому с #CloudFront — только #public (#internet-facing) #LoadBalancer.
Завести #external (internet-facing/#public) #LoadBalancer (#ELB/#ALB/#NLB) на расположенные в #private #subnet виртуалки никаких проблем нет. Просто указываем для него, как и положено, #DMZ #subnet (#public):

albExt:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: externalAlb
Scheme: internet-facing
Subnets: # DMZ if public
- !ImportValue subnetVpc4DmzA
- !ImportValue subnetVpc4DmzB
SecurityGroups:
- !Ref sgAlb


А виртуалкам, расположенным и в #private_subnet добавляем в #security_group правила полного доступа с данного балансера:

sgInstance:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !ImportValue vpc4
GroupDescription: Full access for ALB
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 0
ToPort: 65535
SourceSecurityGroupId: !Ref sgAlb
Description: All TCP trafic - only for ALB


#CloudFormation #templates
Чтобы защитить #CloudFormation стэки от удаления/изменения (#termination_protection неудобно и даёт лишь защиту от удаления) в каком-то аккаунте (предполагая, что он входит в AWS #Organizations), можно добавить следующее #SCP:

"CloudFormation CRUD Deny"
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1539948147000",
"Effect": "Deny",
"Action": [
"cloudformation:CreateChangeSet",
"cloudformation:CreateStack",
"cloudformation:CreateStackInstances",
"cloudformation:CreateStackSet",
"cloudformation:CreateUploadBucket",
"cloudformation:DeleteChangeSet",
"cloudformation:DeleteStack",
"cloudformation:DeleteStackInstances",
"cloudformation:DeleteStackSet",
"cloudformation:ExecuteChangeSet",
"cloudformation:SetStackPolicy",
"cloudformation:UpdateStack",
"cloudformation:UpdateStackInstances",
"cloudformation:UpdateStackSet",
"cloudformation:UpdateTerminationProtection"
],
"Resource": [
"*"
]
}
]
}

#blue_green_deployment
При использовании #DNS #Alias нужно учитывать, что #HostedZoneId разный для разных Alias Target.
Для #CloudFront он фиксированный Z2FDTNDATAQYW2:

aliasSite:
Type: AWS::Route53::RecordSet
Properties:
HostedZoneName: !Join ['', [!Ref MainDomain, '.']]
Name: !Ref MainDomain
Type: A
AliasTarget:
DNSName: !Ref CnameSite
HostedZoneId: Z2FDTNDATAQYW2


Для #LoadBalancer нужно получать его через #GetAtt, для #ELB это:

HostedZoneId1:
Value: !GetAtt [elbExt, '
CanonicalHostedZoneNameID']

Для #ALB это:

HostedZoneId1:
Value: !GetAtt [albExt, '
CanonicalHostedZoneID']

Для #alias на другую #RecordSet нужно получать #HostedZoneId домена:

def Result = sh( script: 'aws route53 list-hosted-zones-by-name --dns-name '+gos.MainDomain, returnStdout: true )
def ResultJson = readJSON ( text: Result )
Stack['dns']['params']['HostedZoneIdDomain'] = ResultJson['HostedZones'][0]['Id'].split('/')[2]
При использовании #ELB (созданного через #CloudFormation) с большим количеством инстансов, стоит помнить про фичу Cross-Zone Load Balancing, которая отключена по умолчанию (при создании балансера через консоль - включена по умолчанию).
Итого: для #ELB её нужно включать для более гладкого распределения трафика. У #ALB всегда включена, у #NLB - нужно включать самому.
Для #ECS наконец появились образы на базе #AMILinux2 - ECS-Optimized Amazon Linux 2 AMI. Для автоматического получения добавляем '-2' в конце. Или скрипт для #CloudFormation #templates:

for region in $(aws ec2 describe-regions --region us-east-1 --query 'Regions[].[RegionName]' --output text | sort); \
do printf " ${region}:\n AmiId: \
$(aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id \
--query 'Parameters[0].[Value]' --output text --region $region)\n" ; done
Используя какую-то #IAM роль для переключения в другую роль, нужно не забывать про role chaining:
Using the credentials for one role to assume a different role is called role chaining. When you use role chaining, your new credentials are limited to a maximum duration of one hour.
Это в, в частности, объясняет раздражающую всех проблему при использовании AWS #SSO - когда через час сбразывается сессия.
Cloud Custodian https://capitalone.github.io/cloud-custodian/docs/index.html подойдёт для реализации #compliance, проверки #policy и всевозможных требований к различным #environment. При этом #serverless и помимо #AWS поддерживает также #Azure и #google #GCP.
В общем случае (99%) лучше не использовать #NACL (Network ACL), т.к. их использование в дополнение к #security_group сильно запутывает будущую поддержку (можно забыть и долго после вспоминать, почему не работает, хотя доступ стоит), однако они могут выручить, если нужно:
—быстро/просто забанить внейшний айпишник (а нет возможности-желания лезть в инстанс и делать это через #iptables)
разграничить доступ (изолировать) между подсетями внутри одной #VPC
Чтобы ограничить доступ на отдельный #Region, то в #IAM с середины 2018-го года имеется специальный #condition aws:RequestedRegion:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyAllRegionsExceptFrankfurt",
"Effect": "Deny",
"NotAction": [
"iam:*",
"organizations:*",
"support:*",
"aws-portal:*",
"route53:*"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": [
"eu-central-1"
]
}
}
}
]
}

Блок "NotAction" добавлен для регионов, которые глобальные (чтобы к ним не применялось это правило).
Когда нужно подобрать/оценить нужный тип #EC2 инстанса по требованиям типа "ходовые и только самые современные с 4 или 8 процессорами в Лондоне", то можно использовать regex ((c|m)5|t3).*(4|8) vCPUs на https://ec2instances.info/?filter=((c%7Cm)5%7Ct3).*(4%7C8).vCPUs&region=eu-west-2#info.