in AWS

AWS API Gateway和Lambda的简单测试

测试了一下使用API Gateway来触发Lambda应用,并将结果显示在网页上。
Lambda支持语言为: Node.js,Java,Python,C#,Go,PowerShell,等等。它具有无需管理服务器,根据需求自动扩展,便宜等优势。

具体流程

在S3 Bucket里存放网页,显示网页后,在网页里通过API Gateway来触发Lambda功能应用,并将Lambda功能应用返回的结果显示在网页上。Route53来使用DNS网址为可选。

创建Lambda应用

Lambda是EC2在一起的Compute界面下,点进去后,再点Create Function来创建函数, 取名为:XiongLambdaFunction,语言设置为Python 3.6,这样会自动生成以下代码:

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

进行以下替换:

import json
def lambda_handler(event, context):
    print("In lambda handler")

    resp = {
        "statusCode": 200,
        "headers": {
            "Access-Control-Allow-Origin": "*",
        },
        "body": "Xiong Huilin"
    }

    return resp

创建API Gateway

创建一个API Gateway,在Networking & Content Delivery下点API Gateway,选择
REST,API取名为:XiongTestAPI,在Actions下点Create Method,选择GET方法,Integration type选择Lambda Function,并选择前面已经创建的XiongLambdaFunction。点保存,有以下提示。

==You are about to give API Gateway permission to invoke your Lambda function:
arn:aws:lambda:ap-southeast-1:606255748358:function:XiongLambdaFunction==

Deploy API对API进行发布,发布成功后会有一个URL生成,这个生成的URL将会被用做第三步测试:

==Invoke URL: https://p9ciqi7imh.execute-api.ap-southeast-1.amazonaws.com/XiongReturnNameAPI==

S3 Bucket网页测试触发API Gateway和Lambda函数

创建两个文件:Index.html和error.html,此测试是根据ACloud Guru所做的示例。
在index.html里,将GET请求的URL替换为: ==https://p9ciqi7imh.execute-api.ap-southeast-1.amazonaws.com/XiongReturnNameAPI==,如下html代码所示

<html>
<script>

function myFunction() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
        document.getElementById("my-demo").innerHTML = this.responseText;
        }
    };
    xhttp.open("GET", "https://p9ciqi7imh.execute-api.ap-southeast-1.amazonaws.com/XiongReturnNameAPI", true);
    xhttp.send();

}

</script>
<body><div align="center"><br><br><br><br>
<h1>Hello <span id="my-demo">2nd December 2019!</span></h1>
<button onclick="myFunction()">Click me</button><br>
<img src="https://www.dropbox.com/s/2965glxbyqjmi9h/SanTi.jpg?raw=1"></div>
</body>
</html>

error.html

<html><body><h1>There has been an error for Xiong's website!</h1></body></html>

创建一个S3 Bucket,取名为: xionglambdatest,在Properties下面进行设置,Static website hosting,创建了以下Endpoint, Index document设置为index.htmlError Document设置为error.html,保存。
==Static website hosting
Endpoint : http://xionglambdatest.s3-website-ap-southeast-1.amazonaws.com==

将前面创建的index.htmlerror.html进行上传,

如果你注册了域名的话,可以使用Route53来设置 A Record来指向S3 Bucket的Endpoint达到域名访问的目的。

这里直接测试:
==Static website hosting
Endpoint : http://xionglambdatest.s3-website-ap-southeast-1.amazonaws.com==

返回以下错误:

403 Forbidden
Code: AccessDenied
Message: Access Denied
RequestId: 0264A5A5BC4FBDE3
HostId: r03Yr+l5vDDiR/0YQL8if2qmRP1lBvBzLoeoGgw6z3jec8XnyWJsz790UwmZGI49ejY5QFYWrfE=
An Error Occurred While Attempting to Retrieve a Custom Error Document
Code: AccessDenied
Message: Access Denied

在S3 Bucket xionglambdatest中,设置Make Public,确认,再试,可以成功访问。

点按钮无反应,在Chrome的Develop Tool里发现碰到以下错误:

Access to XMLHttpRequest at 
'https://byaaiuzpad.execute-api.ap-southeast-1.amazonaws.com/XiongReturnNameAPI' 
from origin 'http://xionglambdatest.s3-website-ap-southeast-1.amazonaws.com' 
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is 
present on the requested resource.

CORS在作怪,在Resource下里的Action里点Enable CORS,再试, 点按钮后,界面返回如下:

Hello {"statusCode": 200, "headers": {"Access-Control-Allow-Origin": "*"}, 
"body": "Xiong Huilin"}

说明https://p9ciqi7imh.execute-api.ap-southeast-1.amazonaws.com/XiongReturnNameAPI返回了{"statusCode": 200, "headers": {"Access-Control-Allow-Origin": "*"}, "body": "Xiong Huilin"}

重新再试,在创建GET方法时,记得把Use Lambda Proxy integration选择项选上, 表明是Lambda返回值 。另外记得在Resource下里的Action里点Enable CORS, 最后Deploy API。这次成功。

点按钮后,以下文字:
Hello 2nd December 2019!
变为:
Hello Xiong Huilin
也就是https://p9ciqi7imh.execute-api.ap-southeast-1.amazonaws.com/XiongReturnNameAPI返回了Xiong Huilin,测试成功!

点完按钮的效果如下:

Lambda

碰到S3 Bucket删除问题

前面做Elastic Beanstalk测试的时候:AWS的CloudFormation和Elastic Beanstalk的简单测试,自动创建了名为elasticbeanstalk-ap-southeast-1-606255748358的S3 Bucket,删除时返回了Access Denied的错误。

参见: AWS Forum: can't delete empty elasticbeanstalk created bucket

在以下Bucket Policy的JSON文件里将Deny改成Allow,就可以删除了,问题解决。

        {
            "Sid": "eb-58950a8c-feb6-11e2-89e0-0800277d041b",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:DeleteBucket",
            "Resource": "arn:aws:s3:::elasticbeanstalk-ap-southeast-1-606255748358"
        }

参见Bucket Policy Examples,可以使用以下JSON文件设置Bucket Policy以达到Bucket为公共访问的目的:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::xionglambdatest/*"
        }
    ]
}

术语

==Lambda==:参见什么是 AWS Lambda?
==REST==:参见Representational_state_transfer 维基

Reference

Lambda Troubleshooting - Acloudguru
什么是 AWS Lambda?
Representational_state_transfer 维基
AWS的CloudFormation和Elastic Beanstalk的简单测试
AWS Forum: can't delete empty elasticbeanstalk created bucket
ACloud Guru
Bucket Policy Examples

AWS的CloudFormation和Elastic Beanstalk的简单测试

CloudFormation CloudFormation归类在Management & Governance下,它有很多模板可以直接使用,模板实际上是包含配置的文本文件,使用模板可以用很简单的操作可以创建,重复创建和设置很复杂的应用。 这里做一个简单的测试,点Create stack,取名: XiongStack,再使用Use a sample template,使用已有的模板,创建一个Wordpress blog,并进行各种设置。在这里可以看到模板的细节,也可以对模板进行编辑。 创建后可以在Events下看到进度。创建完成后,在Resource下查看网址:http://ec2-13-229-131-47.ap-southeast-1.compute.amazonaws.com/wordpress/,输入后有以下提示: ==Your server is running PHP version 5.3.29 but WordPress 5.3 requires at least 5.6.20.== 这个问题以前碰到过,需要升级PHP版本,参见使用AWS云安装WordPress + RDS MySQL方法进行解决,解决后以下网址可以正常访问: http://ec2-13-229-131-47.ap-southeast-1.compute.amazonaws.com/wordpress/ 测试完成后,删除这个Stack,那么这个Stack下所有的资源全部都被删除。 Elastic Beanstalk Elastic Beanstalk是在EC2界面里,它主要实现了容器的功能,使你不用担心底层的架构,例如负载均衡,扩展,运行健康检查等,使用者只需关注于应用层的创建和设置。 创建一个Elastic Beanstalk,进入Create a web app,取名为XiongElasticBeanstalk,使用PHP,并使用Sample Application,也就是样例应用,这里是简单起见。当然也可以上传代码(上传ZIP或者WAR),发布成功后,查看以下生成的 DNS网址,成功访问。 http://xiongelasticbeanstalk-env-1.pysmrc6iwc.ap-southeast-1.elasticbeanstalk.com/ 可以对样例程序进行下载,修改,再上传,进行发布,出现以下问题: ==Forbidden== ==You don't have permission to access this resource.== 查找原因,参见403 Forbidden error,原因如下: ==When zipping up the files Winzip has created a additional folder to contain all files.

AWS通过自动扩展实现高可用 – 创建一个高可用WordPress站点

创建两个S3 Bucket,分别存放Image和Code 创建两个S3,分别存放Image和Code,一个S3 Bucket命名为xiongwpmedia2019,存放图片,另一个S3 Bucket命名为xiongcode2019,用来存放Wordpress代码。 使用CloudFront来访问图片 在Networking & Content Delivery下的CloudFront,做以下设置, Origin Domain Name选择刚刚创建的S3 Bucket, 为xiongwpmedia2019.s3.amazonaws.com。 其它设置为默认。 创建一个Security Group,开放 ipv4 and ipv6的http, port 80, 和 ssh, 22 port,名字设置为Webdmz。 再创建一个 RDS使用的Security Group,取名为MyRDSSG, 允许 3306 port, TCP, Mysql/Aurora, 确保它开放给刚刚创建的 名为Webdmz的 Security Group.

AWS中使用负载均衡

进行实验,创建两个EC2, 每一个EC2在一个AZ (Availability Zone)里,再创建一个ELB,达到负载均衡的目的。 AWS负载均衡有三种: Application Load Balancer Network Load Balancer Classic Load Balancer,如果应用没有反应,那么ELB会返回504 这三种负载均衡有一些区别,首先,Application Load Balancers 和 Network Load Balancers需要使用Target Group,注册实例到Target Group,流量会用到Target Group, Classic Load Balancer需要直接注册实例到Load Balancers。 另外, Application Load Balancers的cross-zone load balancing设置是一直开启的,Network Load Balancer的cross-zone load balancing设置默认关闭,可以设置开启。Classic Load Balancer,如果使用API 或者 CLI创建,cross-zone load balancing设置默认关闭,如果使用界面进行创建,cross-zone load balancing设置默认开启。 创建两个EC2 创建两个EC2,分别在不同的AZ里,启动脚本分别是: 第一个EC2, #!/bin/bash yum update -y yum install httpd -y service httpd start chkconfig httpd on cd /var/www/html echo "<html><h1>这是我的第一个服务器</h1></html>" > index.html 第二个EC2, #!/bin/bash yum update -y yum install httpd -y service httpd start chkconfig httpd on cd /var/www/html echo "<html><h1>这是我的第二个服务器</h1></html>" > index.html 创建一个Classic Load Balancer 在EC2界面里的Load Balancer里创建Classic Load Balancer,注意到里面是灰色的,显示PREVIOUS GENERATION for HTTP, HTTPS, and TCP,估计是以后要废弃了。取名:XiongTestLB,默认先前创建的安全组:MyWebDMZ。添加前面创建的两个实例,另外设置安全检查,检查点为/index.html。 Step 4: Configure Health Check Cancel Previous Next: Add EC2 Instances Your load balancer will automatically perform health checks on your EC2 instances and only route traffic to instances that pass the health check.

在AWS中创建定制的虚拟私有云(VPC)

创建定制VPC AWS里一般默认有一个VPC,如果直接使用的话,可以省去很多麻烦。如果创建定制VPC,所有的组件需要各个创建,可以了解各个组件的细节。如果创建定制的VPC,会新创建一个默认的Route Table,Network ACL,和Security Group。不会创建Subnet和Internet Gateway。 创建一个定制的VPC并取名为XiongTestVPC, IPv4 CIDR block为10.0.0.0/16,如下图所示: 这里默认创建了Network ACL是允许所有的流量进出, 也就是所有的Source和Destination都是0.0.0.0/0允许。 以下未知,是否要设置DNS resolution和DNS hostnames为Enabled? DNS resolution Enabled DNS hostnames Enabled 在VPC里创建两个Subnet 首先创建公用Subnet,名字为XiongPublicSubnet,VPC选择新定制的VPC-->XiongTestVPC,IPv4 CIDR block为10.0.1.0/24,这里Availability Zone选择ap-southeast-1a。 ==注意==: 这里选择了ap-southeast-1a,如果在另一个帐户里也选择了ap-southeast-1a,这两个Availability Zone并不一定是同一个,因为AWS会随机分配,这样可以保证不会有大多数用户选择同一个Availability Zone。创建公用Subnet如下图所示: 对于公有的Subnet,改变设置公有的Subnet的自动分配公有地址,在Action --> Modify auto-assign IP settings里,如下图所示: 同理,创建另一个私有的Subnet,名字为XiongPrivateSubnet,VPC选择新定制的VPC-->XiongTestVPC,IPv4 CIDR block为10.0.2.0/24,这里Availability Zone选择ap-southeast-1b。 这里创建的两个Subnet, 默认Route Table里只能访问本地,需要在后面关联能够访问外网的Route Table,Network ACL默认为前面新创建的VPC所默认生成的Network ACL。 创建Internet Gateway 创建一个名为XiongTestInternetGateway的Internet Gateway,并把它附加到新创建的定制VPC上。如下图所示: ==注意==:一个VPC只能附加一个Internet gateway。 创建额外的Route table访问外部 创建额外的Route table 在创建定制VPC的时候,会默认创建一个Route table为主Route Table,这个默认创建的Route Table只能访问本地,是私有的(private),不能访问外部,这个Route Table专门用于内部私有的Subnet。那么这里我们创建一个额外的Route table可以访问外部,取名为XiongRouteTablePublic,用于外部的公有的Subnet。如下图所示: 添加路由到Internet Gateway 在XiongRouteTablePublic这个公有的Route Table里添加两个(分别是IPV4和IPV6)指向前面新创建的可以访问外部的Internet Gateway, 也就是XiongTestInternetGateway,0.0.0.0/0为IPV4, ::/0为IPV6,如下图所示: 关联公有Subnet到额外的公有的Route table 关联公有Subnet也就是XiongPublicSubnet到额外的Route table也就是XiongRouteTablePublic,在Subnets > Edit route table association界面中,这样公有Subnet就可以访问外部公网我了。添加的地方如下图所示: 在定制VPC里创建一个新的Security Group (安全组) 在定制VPC XiongTestVPC 里创建一个新的Security Group (安全组),取名为XiongInternalSecurityGroup,用途为内部的EC2使用,默认的Inbound Rules为空,Outbound Rules为所有。 所以在Inbound Rules中添加内网的Subnet地址可以访问以下端口。 ICMP --> 0~65536 HTTP --> 80 HTTPS --> 443 MYSQL/Aurora --> 3306 SSH --> 22 如下图所示: ==注意==:Security Groups不能跨VPC。一个VPC里只能有一个Internet Gateway。 ==注意==:Security Groups是stateful,也就是说添加到Inbound的规则,也自动添加到Outbound上去。 在定制VPC里创建两个EC2 (公有和私有) 在定制VPC里创建两个EC2 (公有和私有),公有EC2可以访问外网,也可以被外网访问,例如Web Server,私有EC2只能内部才能访问,例如数据库服务器。 创建公有EC2 使用以下启动脚本: #!/bin/bash yum install httpd -y yum update -y service httpd start chkconfig httpd on echo "<html><h1>Hello Xiong, this is public EC2 Instance!</h1></html>" > /var/www/html/index.html 这里要选择, XiongTestVPC和XiongPublicSubnet,前面已经设置过XiongPublicSubnet会自动分配公网地址, 如下图所示: 创建私有EC2 再创建一个私有EC2,假如用作内部数据服务器,这里要选择, XiongTestVPC和XiongPrivateSubnet,前面已经设置过XiongPrivateSubnet 不会自动分配公网地址,

AWS Route53里使用Godady注册的域名

AWS的Route53是可以注册域名的,但是如果在外部注册的域名怎么在Route53里使用呢,这里使用外网的DNS服务的Godaddy注册域名,并在AWS的Route53里使用。 注册域名并下载Zonefile 在Godaddy里注册域名xionghuilin.club,并在管理域名里下载Zonefile, 自动下载并命名为xionghuilin.club.txt 在Route53里创建hosted zone 在Route53里创建hosted zone,会自动生成SOA和NS,如下: 在Godaddy中添加新生成的NS 以下四条NS需要添加到Godaddy中,xionghuilin.club的name server如下: ns-727.awsdns-26.net.