Когда в #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.
Псевдо-переменные амазона. Самые востребованные:
AWS::Region
AWS::AccountId
AWS::StackName
#CloudFormation
AWS::Region
AWS::AccountId
AWS::StackName
#CloudFormation
Amazon
Pseudo parameters reference - AWS CloudFormation
Lists the details of the available pseudo parameters that are predefined by AWS CloudFormation.
В официальной документации по #cross_account #s3_replication ошибки - пример указан с неполными правами в #bucket_policy для аккаунта источника:
...
Полные указаны в примере предыдущего поста. Их нужно добавить и для роли источника, особенно с учётом, если нужно менять владельца.
Потому, для простоты, можно сразу давать полные
...
"Action":["s3:ReplicateObject", "s3:ReplicateDelete"],...
Полные указаны в примере предыдущего поста. Их нужно добавить и для роли источника, особенно с учётом, если нужно менять владельца.
Потому, для простоты, можно сразу давать полные
s3:* - т.е. в приведённой ссылке на документацию по #cross_region #s3 #replication будет работать, если сделать так:{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "Full access for other account",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "s3:*" ,
"Resource": [
"arn:aws:s3:::replication-bucket",
"arn:aws:s3:::replication-bucket/*"
]
}
]
}
Аналогично сделать и в роли аккаунта источника:- Effect: Allow
Action: 's3:*'
Resource: ## destination bucket
- 'arn:aws:s3:::replication-bucket'
- 'arn:aws:s3:::replication-bucket/*'Amazon
Example 2: Configure CRR When Source and Destination
Buckets Are Owned by Different AWS Accounts - Amazon Simple Storage…
Buckets Are Owned by Different AWS Accounts - Amazon Simple Storage…
Example of configuring Amazon S3 cross-region replication (CRR) when source and destination buckets are owned by a different AWS accounts.
Для доступа к #s3 можно использовать #iam, #bucket_policy и #bucket_acl - что же лучше использовать?
Если коротко, то всегда лучше выбирать #IAM.
Когда не получается или нужен как раз #resource_based подход - выбираем #bucket_policy (без него не обойтись для случаев #cross_account).
Использовать ACL не стоит ни разу - это и старое и неудобное.
Если коротко, то всегда лучше выбирать #IAM.
Когда не получается или нужен как раз #resource_based подход - выбираем #bucket_policy (без него не обойтись для случаев #cross_account).
Использовать ACL не стоит ни разу - это и старое и неудобное.
Amazon
IAM Policies and Bucket Policies and ACLs! Oh, My! (Controlling Access to S3 Resources) | Amazon Web Services
September 11, 2023: This post has been updated. Updated on July 6, 2023: This post has been updated to reflect the current guidance around the usage of S3 ACL and to include S3 Access Points and the Block Public Access for accounts and S3 buckets. Updated…
При использовании #cross_account #s3_replication нужно учитывать, что destination #s3 бакет должен:
- существовать на момент отработки #CloudFormation #templates
- иметь #versioning (обязательно требуется для #replication)
- быть в другом #region
Пример кода - cross-account cross-region s3 bucket replication.
Также стоит обратить внимание, что роль на репликацию создаётся в аккаунте источника (которая указывается в ReplicationConfiguration бакета), а не в аккаунте репликации, как может показаться логичным. Мы даём доступ внешнему аккаунту (с бакетом источника) к себе в аккаунте репликации.
- существовать на момент отработки #CloudFormation #templates
- иметь #versioning (обязательно требуется для #replication)
- быть в другом #region
Пример кода - cross-account cross-region s3 bucket replication.
Также стоит обратить внимание, что роль на репликацию создаётся в аккаунте источника (которая указывается в ReplicationConfiguration бакета), а не в аккаунте репликации, как может показаться логичным. Мы даём доступ внешнему аккаунту (с бакетом источника) к себе в аккаунте репликации.
GitHub
applerom/cloudformation-examples
AWS CloudFormation code examples. Contribute to applerom/cloudformation-examples development by creating an account on GitHub.