mirror of
https://github.com/verdaccio/verdaccio.git
synced 2024-12-16 21:56:25 -05:00
docs: Add example AWS CloudFormation template
In a new contrib/ directory.
This commit is contained in:
parent
4507dc8394
commit
ad0d9900f3
1 changed files with 341 additions and 0 deletions
341
contrib/aws/cloudformation-ec2-efs.yaml
Normal file
341
contrib/aws/cloudformation-ec2-efs.yaml
Normal file
|
@ -0,0 +1,341 @@
|
||||||
|
# Instructions:
|
||||||
|
# 1. Check all "TODO" comments and make changes if required for your environment
|
||||||
|
# 2. Provide values for all required parameters and any optional parameters desired
|
||||||
|
|
||||||
|
AWSTemplateFormatVersion: '2010-09-09'
|
||||||
|
Description: Verdaccio - NPM cache / private registry
|
||||||
|
Parameters:
|
||||||
|
# REQUIRED PARAMETERS
|
||||||
|
Ami:
|
||||||
|
Type: AWS::EC2::Image::Id
|
||||||
|
Description: >
|
||||||
|
Amazon Linux 2 AMI ID for the proxy instances. Find it with
|
||||||
|
'aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
|
||||||
|
Ec2KeyPair:
|
||||||
|
Type: String
|
||||||
|
Description: EC2 Key Pair to use for the proxy instances.
|
||||||
|
HttpsCertificateArn:
|
||||||
|
Type: String
|
||||||
|
Description: ACM certificate ARN to use
|
||||||
|
DnsHostedZoneName:
|
||||||
|
Type: String
|
||||||
|
Description: >
|
||||||
|
The route 53 hosted zone name to create the `npm.<zone>` record in. Do not
|
||||||
|
include the trailing dot!
|
||||||
|
Route53RecordHostedZoneId:
|
||||||
|
Type: String
|
||||||
|
Description: >
|
||||||
|
Hosted Zone ID for the load balancer. Find it here:
|
||||||
|
https://docs.aws.amazon.com/general/latest/gr/rande.html
|
||||||
|
Vpc:
|
||||||
|
Type: AWS::EC2::VPC::Id
|
||||||
|
Description: VPC to create this stack inside
|
||||||
|
AsgSubnets:
|
||||||
|
Type: List<AWS::EC2::Subnet::Id>
|
||||||
|
Description: >
|
||||||
|
Subnets the auto scaling group should span.
|
||||||
|
LbSubnets:
|
||||||
|
Type: List<AWS::EC2::Subnet::Id>
|
||||||
|
Description: >
|
||||||
|
Subnets the load balancer should span.
|
||||||
|
VerdaccioConfigUrl:
|
||||||
|
Type: String
|
||||||
|
Description: URL the ASG instances can download Verdaccio's config.yaml from.
|
||||||
|
# TODO: if you aren't using htpasswd authentication, remove this parameter
|
||||||
|
# and the associated user data reference.
|
||||||
|
VerdaccioHtpasswdUrl:
|
||||||
|
Type: String
|
||||||
|
Description: URL the ASG instances can download Verdaccio's htpasswd from.
|
||||||
|
|
||||||
|
# OPTIONAL PARAMETERS
|
||||||
|
DockerImage:
|
||||||
|
Type: String
|
||||||
|
Default: verdaccio/verdaccio:3
|
||||||
|
AsgMinSize:
|
||||||
|
Type: String
|
||||||
|
Default: "1"
|
||||||
|
AsgMaxSize:
|
||||||
|
Type: String
|
||||||
|
Default: "1"
|
||||||
|
AsgInstanceType:
|
||||||
|
Type: String
|
||||||
|
Default: t3.nano
|
||||||
|
DnsName:
|
||||||
|
Type: String
|
||||||
|
Default: npm
|
||||||
|
Description: The Route 53 record created is $DnsName.$DnsHostedZoneName
|
||||||
|
|
||||||
|
Resources:
|
||||||
|
Asg:
|
||||||
|
Type: AWS::AutoScaling::AutoScalingGroup
|
||||||
|
DependsOn:
|
||||||
|
- EfsMountA
|
||||||
|
- EfsMountB
|
||||||
|
- EfsMountC
|
||||||
|
Properties:
|
||||||
|
DesiredCapacity:
|
||||||
|
Ref: AsgMaxSize
|
||||||
|
HealthCheckGracePeriod: 60
|
||||||
|
HealthCheckType: ELB
|
||||||
|
LaunchConfigurationName:
|
||||||
|
Ref: Lc
|
||||||
|
MaxSize:
|
||||||
|
Ref: AsgMinSize
|
||||||
|
MinSize:
|
||||||
|
Ref: AsgMaxSize
|
||||||
|
Tags:
|
||||||
|
- Key: Name
|
||||||
|
Value:
|
||||||
|
Ref: AWS::StackName
|
||||||
|
PropagateAtLaunch: true
|
||||||
|
TargetGroupARNs:
|
||||||
|
- Ref: Tg
|
||||||
|
VPCZoneIdentifier:
|
||||||
|
Ref: AsgSubnets
|
||||||
|
|
||||||
|
# TODO: you may want to add target tracking scaling policy. By default the ASG
|
||||||
|
# does not automatically scale.
|
||||||
|
|
||||||
|
AsgSg:
|
||||||
|
Type: AWS::EC2::SecurityGroup
|
||||||
|
Properties:
|
||||||
|
GroupDescription: Used by instances in the Auto Scaling Group.
|
||||||
|
SecurityGroupIngress:
|
||||||
|
- FromPort: 22
|
||||||
|
ToPort: 22
|
||||||
|
IpProtocol: tcp
|
||||||
|
# TODO: you may want to restrict this further
|
||||||
|
CidrIp: 0.0.0.0/0
|
||||||
|
SecurityGroupEgress:
|
||||||
|
- FromPort: 0
|
||||||
|
ToPort: 65535
|
||||||
|
IpProtocol: tcp
|
||||||
|
CidrIp: 0.0.0.0/0
|
||||||
|
Tags:
|
||||||
|
- Key: Name
|
||||||
|
Value:
|
||||||
|
Fn::Sub: ${AWS::StackName} ASG
|
||||||
|
VpcId:
|
||||||
|
Ref: Vpc
|
||||||
|
AsgSgHttpIngress:
|
||||||
|
Type: AWS::EC2::SecurityGroupIngress
|
||||||
|
Properties:
|
||||||
|
GroupId:
|
||||||
|
Ref: AsgSg
|
||||||
|
FromPort: 4873
|
||||||
|
ToPort: 4873
|
||||||
|
IpProtocol: tcp
|
||||||
|
SourceSecurityGroupId:
|
||||||
|
Ref: LbSg
|
||||||
|
|
||||||
|
Lc:
|
||||||
|
Type: AWS::AutoScaling::LaunchConfiguration
|
||||||
|
Properties:
|
||||||
|
ImageId:
|
||||||
|
Ref: Ami
|
||||||
|
InstanceType:
|
||||||
|
Ref: AsgInstanceType
|
||||||
|
KeyName:
|
||||||
|
Ref: Ec2KeyPair
|
||||||
|
SecurityGroups:
|
||||||
|
- Ref: AsgSg
|
||||||
|
UserData:
|
||||||
|
Fn::Base64:
|
||||||
|
# Since this uses Fn::Sub, don't use the ${var} form for any bash
|
||||||
|
# variables. Just use $var.
|
||||||
|
Fn::Sub: |
|
||||||
|
#!/bin/bash
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
start_time=$(date +%s)
|
||||||
|
|
||||||
|
IMAGE="${DockerImage}"
|
||||||
|
BASE="/verdaccio"
|
||||||
|
|
||||||
|
# Mount EFS first
|
||||||
|
yum -y install amazon-efs-utils
|
||||||
|
mkdir /verdaccio
|
||||||
|
echo "${Efs}:/ "$BASE" efs tls,_netdev" >> /etc/fstab
|
||||||
|
mount -a -t efs defaults
|
||||||
|
|
||||||
|
# Create/update the config & password files.
|
||||||
|
mkdir "$BASE/conf"
|
||||||
|
curl -o "$BASE/conf/htpasswd" "${VerdaccioHtpasswdUrl}"
|
||||||
|
curl -o "$BASE/conf/config.yaml" "${VerdaccioConfigUrl}"
|
||||||
|
|
||||||
|
amazon-linux-extras install docker
|
||||||
|
systemctl start docker
|
||||||
|
|
||||||
|
# Download the image
|
||||||
|
docker pull "$IMAGE"
|
||||||
|
|
||||||
|
# Update permissions on the cache directory.
|
||||||
|
target_uid=$(docker run "$IMAGE" id -u)
|
||||||
|
target_gid=$(docker run "$IMAGE" id -g)
|
||||||
|
chown "$target_uid:$target_gid" "$BASE"
|
||||||
|
|
||||||
|
docker run --detach \
|
||||||
|
-p 4873:4873 \
|
||||||
|
--mount "type=bind,src=$BASE,dst=/verdaccio" \
|
||||||
|
"$IMAGE"
|
||||||
|
|
||||||
|
echo "Finished user-data script in $(( $(date +%s) - start_time)) secs"
|
||||||
|
|
||||||
|
Tg:
|
||||||
|
Type: AWS::ElasticLoadBalancingV2::TargetGroup
|
||||||
|
Properties:
|
||||||
|
HealthCheckIntervalSeconds: 5
|
||||||
|
HealthCheckPort: "4873"
|
||||||
|
HealthCheckProtocol: "HTTP"
|
||||||
|
HealthCheckTimeoutSeconds: 2
|
||||||
|
Port: 4873
|
||||||
|
Protocol: "HTTP"
|
||||||
|
TargetGroupAttributes:
|
||||||
|
- Key: deregistration_delay.timeout_seconds
|
||||||
|
Value: "10"
|
||||||
|
VpcId:
|
||||||
|
Ref: Vpc
|
||||||
|
|
||||||
|
Lb:
|
||||||
|
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
|
||||||
|
Properties:
|
||||||
|
SecurityGroups:
|
||||||
|
- Ref: LbSg
|
||||||
|
Subnets:
|
||||||
|
Ref: LbSubnets
|
||||||
|
Tags:
|
||||||
|
- Key: Name
|
||||||
|
Value:
|
||||||
|
Fn::Sub: ${AWS::StackName} ALB
|
||||||
|
|
||||||
|
LbSg:
|
||||||
|
Type: AWS::EC2::SecurityGroup
|
||||||
|
Properties:
|
||||||
|
GroupDescription:
|
||||||
|
Fn::Sub: Allow HTTPS connections to the ${AWS::StackName} load balancer
|
||||||
|
SecurityGroupIngress:
|
||||||
|
# TODO: You may want to restrict the allowed IPs
|
||||||
|
- FromPort: 443
|
||||||
|
ToPort: 443
|
||||||
|
IpProtocol: tcp
|
||||||
|
CidrIp: 0.0.0.0/0
|
||||||
|
Tags:
|
||||||
|
- Key: Name
|
||||||
|
Value:
|
||||||
|
Fn::Sub: ${AWS::StackName} LB
|
||||||
|
VpcId:
|
||||||
|
Ref: Vpc
|
||||||
|
LbSgHttpEgress:
|
||||||
|
Type: AWS::EC2::SecurityGroupEgress
|
||||||
|
Properties:
|
||||||
|
GroupId:
|
||||||
|
Ref: LbSg
|
||||||
|
FromPort: 4873
|
||||||
|
ToPort: 4873
|
||||||
|
IpProtocol: tcp
|
||||||
|
DestinationSecurityGroupId:
|
||||||
|
Ref: AsgSg
|
||||||
|
|
||||||
|
LbListener:
|
||||||
|
Type: AWS::ElasticLoadBalancingV2::Listener
|
||||||
|
Properties:
|
||||||
|
Certificates:
|
||||||
|
- CertificateArn:
|
||||||
|
Ref: HttpsCertificateArn
|
||||||
|
DefaultActions:
|
||||||
|
- TargetGroupArn:
|
||||||
|
Ref: Tg
|
||||||
|
Type: forward
|
||||||
|
LoadBalancerArn:
|
||||||
|
Ref: Lb
|
||||||
|
Port: 443
|
||||||
|
Protocol: HTTPS
|
||||||
|
SslPolicy: ELBSecurityPolicy-TLS-1-2-2017-01
|
||||||
|
|
||||||
|
Dns:
|
||||||
|
Type: AWS::Route53::RecordSet
|
||||||
|
Properties:
|
||||||
|
AliasTarget:
|
||||||
|
DNSName:
|
||||||
|
Fn::GetAtt:
|
||||||
|
- Lb
|
||||||
|
- DNSName
|
||||||
|
HostedZoneId:
|
||||||
|
Ref: Route53RecordHostedZoneId
|
||||||
|
HostedZoneName:
|
||||||
|
Fn::Sub: ${DnsHostedZoneName}.
|
||||||
|
Name:
|
||||||
|
Fn::Sub: ${DnsName}.${DnsHostedZoneName}.
|
||||||
|
Type: A
|
||||||
|
|
||||||
|
Efs:
|
||||||
|
Type: AWS::EFS::FileSystem
|
||||||
|
Properties:
|
||||||
|
FileSystemTags:
|
||||||
|
- Key: Name
|
||||||
|
Value:
|
||||||
|
Ref: AWS::StackName
|
||||||
|
|
||||||
|
EfsSg:
|
||||||
|
Type: AWS::EC2::SecurityGroup
|
||||||
|
Properties:
|
||||||
|
GroupDescription:
|
||||||
|
Fn::Sub: Allow connections from the ${AWS::StackName} ASG
|
||||||
|
Tags:
|
||||||
|
- Key: Name
|
||||||
|
Value:
|
||||||
|
Fn::Sub: ${AWS::StackName} EFS
|
||||||
|
VpcId:
|
||||||
|
Ref: Vpc
|
||||||
|
EfsSgFsIngress:
|
||||||
|
Type: AWS::EC2::SecurityGroupIngress
|
||||||
|
Properties:
|
||||||
|
GroupId:
|
||||||
|
Ref: EfsSg
|
||||||
|
FromPort: 2049
|
||||||
|
ToPort: 2049
|
||||||
|
IpProtocol: tcp
|
||||||
|
SourceSecurityGroupId:
|
||||||
|
Ref: AsgSg
|
||||||
|
|
||||||
|
# TODO: if you have more / less than three subnets for AsgSubnets, add/delete
|
||||||
|
# entries here as appropriate. Also update the DependsOn section of Asg
|
||||||
|
# resource.
|
||||||
|
EfsMountA:
|
||||||
|
Type: AWS::EFS::MountTarget
|
||||||
|
Properties:
|
||||||
|
FileSystemId:
|
||||||
|
Ref: Efs
|
||||||
|
SecurityGroups:
|
||||||
|
- Ref: EfsSg
|
||||||
|
SubnetId:
|
||||||
|
Fn::Select:
|
||||||
|
- 0
|
||||||
|
- Ref: AsgSubnets
|
||||||
|
EfsMountB:
|
||||||
|
Type: AWS::EFS::MountTarget
|
||||||
|
Properties:
|
||||||
|
FileSystemId:
|
||||||
|
Ref: Efs
|
||||||
|
SecurityGroups:
|
||||||
|
- Ref: EfsSg
|
||||||
|
SubnetId:
|
||||||
|
Fn::Select:
|
||||||
|
- 1
|
||||||
|
- Ref: AsgSubnets
|
||||||
|
EfsMountC:
|
||||||
|
Type: AWS::EFS::MountTarget
|
||||||
|
Properties:
|
||||||
|
FileSystemId:
|
||||||
|
Ref: Efs
|
||||||
|
SecurityGroups:
|
||||||
|
- Ref: EfsSg
|
||||||
|
SubnetId:
|
||||||
|
Fn::Select:
|
||||||
|
- 2
|
||||||
|
- Ref: AsgSubnets
|
||||||
|
|
||||||
|
Outputs:
|
||||||
|
Hostname:
|
||||||
|
Value:
|
||||||
|
Ref: Dns
|
Loading…
Reference in a new issue