Skip to content

Commit cd764c2

Browse files
committed
oss-nginx
1 parent 9800507 commit cd764c2

File tree

4 files changed

+342
-0
lines changed

4 files changed

+342
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
## Introduction
2+
3+
<!-- DOCS_DESCRIPTION_CN -->
4+
本示例用于实现解决方案[应用日志数据归档](https://www.aliyun.com/solution/tech-solution/oss-nginx), 涉及到专有网络(VPC)、交换机(VSwitch)、云服务器(ECS)、RAM 用户等资源的创建。
5+
<!-- DOCS_DESCRIPTION_CN -->
6+
7+
<!-- DOCS_DESCRIPTION_EN -->
8+
This example is used to implement solution [Archive App Logs](https://www.aliyun.com/solution/tech-solution/oss-nginx). It involves the creation, and deployment of resources such as Virtual Private Cloud (VPC), VSwitch, Elastic Compute Service (ECS), and RAM users.
9+
<!-- DOCS_DESCRIPTION_EN -->
10+
11+
<!-- BEGIN_TF_DOCS -->
12+
## Providers
13+
14+
| Name | Version |
15+
|------|---------|
16+
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | n/a |
17+
| <a name="provider_random"></a> [random](#provider\_random) | n/a |
18+
19+
## Modules
20+
21+
No modules.
22+
23+
## Resources
24+
25+
| Name | Type |
26+
|------|------|
27+
| [alicloud_ecs_command.run_command_nginx_loongcollector](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/ecs_command) | resource |
28+
| [alicloud_ecs_invocation.invoke_script_nginx_loongcollector](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/ecs_invocation) | resource |
29+
| [alicloud_instance.ecs_instance](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/instance) | resource |
30+
| [alicloud_log_machine_group.this](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/log_machine_group) | resource |
31+
| [alicloud_log_oss_export.example](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/log_oss_export) | resource |
32+
| [alicloud_log_project.sls_project](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/log_project) | resource |
33+
| [alicloud_log_store.sls_log_store](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/log_store) | resource |
34+
| [alicloud_log_store_index.sls_index](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/log_store_index) | resource |
35+
| [alicloud_logtail_attachment.this](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/logtail_attachment) | resource |
36+
| [alicloud_logtail_config.this](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/logtail_config) | resource |
37+
| [alicloud_oss_bucket.oss_bucket](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/oss_bucket) | resource |
38+
| [alicloud_ram_access_key.ramak](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/ram_access_key) | resource |
39+
| [alicloud_ram_role.log_default_role](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/ram_role) | resource |
40+
| [alicloud_ram_role_policy_attachment.attach_policy_to_role](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/ram_role_policy_attachment) | resource |
41+
| [alicloud_ram_user.ram_user](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/ram_user) | resource |
42+
| [alicloud_ram_user_policy_attachment.attach_policy_to_user](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/ram_user_policy_attachment) | resource |
43+
| [alicloud_security_group.security_group](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/security_group) | resource |
44+
| [alicloud_security_group_rule.allow_db](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/security_group_rule) | resource |
45+
| [alicloud_security_group_rule.allow_http](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/security_group_rule) | resource |
46+
| [alicloud_security_group_rule.allow_ssh](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/security_group_rule) | resource |
47+
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/vpc) | resource |
48+
| [alicloud_vswitch.vswitch](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/resources/vswitch) | resource |
49+
| [random_string.suffix](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string) | resource |
50+
| [alicloud_images.default](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/data-sources/images) | data source |
51+
| [alicloud_log_service.open](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/data-sources/log_service) | data source |
52+
| [alicloud_oss_service.open](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/data-sources/oss_service) | data source |
53+
| [alicloud_zones.default](https://registry.terraform.io/providers/hashicorp/alicloud/latest/docs/data-sources/zones) | data source |
54+
55+
## Inputs
56+
57+
| Name | Description | Type | Default | Required |
58+
|------|-------------|------|---------|:--------:|
59+
| <a name="input_ecs_instance_password"></a> [ecs\_instance\_password](#input\_ecs\_instance\_password) | 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)` | `string` | n/a | yes |
60+
| <a name="input_ecs_instance_type"></a> [ecs\_instance\_type](#input\_ecs\_instance\_type) | 实例类型 | `string` | `"ecs.t6-c1m2.large"` | no |
61+
| <a name="input_region"></a> [region](#input\_region) | n/a | `string` | `"cn-hangzhou"` | no |
62+
<!-- END_TF_DOCS -->
Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
provider "alicloud" {
2+
region = var.region
3+
}
4+
5+
data "alicloud_zones" "default" {
6+
available_disk_category = "cloud_essd"
7+
available_resource_creation = "VSwitch"
8+
available_instance_type = var.ecs_instance_type
9+
}
10+
11+
resource "random_string" "suffix" {
12+
length = 8
13+
lower = true
14+
upper = false
15+
numeric = false
16+
special = false
17+
}
18+
19+
locals {
20+
common_name = random_string.suffix.id
21+
}
22+
23+
resource "alicloud_vpc" "vpc" {
24+
cidr_block = "192.168.0.0/16"
25+
vpc_name = "vpc-${local.common_name}"
26+
}
27+
28+
resource "alicloud_vswitch" "vswitch" {
29+
vpc_id = alicloud_vpc.vpc.id
30+
cidr_block = "192.168.0.0/24"
31+
zone_id = data.alicloud_zones.default.zones.0.id
32+
vswitch_name = "vswitch-${local.common_name}"
33+
}
34+
35+
resource "alicloud_security_group" "security_group" {
36+
vpc_id = alicloud_vpc.vpc.id
37+
security_group_name = "sg-${local.common_name}"
38+
}
39+
40+
resource "alicloud_security_group_rule" "allow_ssh" {
41+
type = "ingress"
42+
ip_protocol = "tcp"
43+
nic_type = "intranet"
44+
policy = "accept"
45+
port_range = "22/22"
46+
priority = 1
47+
security_group_id = alicloud_security_group.security_group.id
48+
cidr_ip = "0.0.0.0/0"
49+
}
50+
51+
resource "alicloud_security_group_rule" "allow_http" {
52+
type = "ingress"
53+
ip_protocol = "tcp"
54+
nic_type = "intranet"
55+
policy = "accept"
56+
port_range = "80/80"
57+
priority = 1
58+
security_group_id = alicloud_security_group.security_group.id
59+
cidr_ip = "0.0.0.0/0"
60+
}
61+
62+
resource "alicloud_security_group_rule" "allow_db" {
63+
type = "ingress"
64+
ip_protocol = "tcp"
65+
nic_type = "intranet"
66+
policy = "accept"
67+
port_range = "3306/3306"
68+
priority = 1
69+
security_group_id = alicloud_security_group.security_group.id
70+
cidr_ip = "0.0.0.0/0"
71+
}
72+
73+
data "alicloud_images" "default" {
74+
name_regex = "^aliyun_3_x64_20G_alibase_.*"
75+
most_recent = true
76+
owners = "system"
77+
}
78+
79+
resource "alicloud_ram_user" "ram_user" {
80+
name = "ram-user-${local.common_name}"
81+
}
82+
83+
resource "alicloud_ram_access_key" "ramak" {
84+
user_name = alicloud_ram_user.ram_user.name
85+
}
86+
87+
resource "alicloud_ram_user_policy_attachment" "attach_policy_to_user" {
88+
user_name = alicloud_ram_user.ram_user.name
89+
policy_type = "System"
90+
policy_name = "AliyunLogFullAccess"
91+
depends_on = [
92+
alicloud_ram_access_key.ramak
93+
]
94+
}
95+
96+
resource "alicloud_instance" "ecs_instance" {
97+
instance_name = "ecs-${local.common_name}"
98+
image_id = data.alicloud_images.default.images[0].id
99+
instance_type = var.ecs_instance_type
100+
system_disk_category = "cloud_essd"
101+
security_groups = [alicloud_security_group.security_group.id]
102+
vswitch_id = alicloud_vswitch.vswitch.id
103+
password = var.ecs_instance_password
104+
internet_max_bandwidth_out = 5
105+
}
106+
107+
resource "alicloud_ecs_command" "run_command_nginx_loongcollector" {
108+
name = "command-run-nginx-loongcollector-${local.common_name}"
109+
command_content = base64encode(<<EOF
110+
#!/bin/bash
111+
yum update -y
112+
yum install -y nginx
113+
systemctl start nginx
114+
systemctl enable nginx
115+
116+
wget http://aliyun-observability-release-${var.region}.oss-${var.region}.aliyuncs.com/loongcollector/linux64/latest/loongcollector.sh -O loongcollector.sh
117+
chmod +x loongcollector.sh
118+
./loongcollector.sh install ${var.region}-internet
119+
120+
cat << EOJ >> genlog.sh
121+
echo "127.0.0.1 - - [\$(date +'%d/%b/%Y:%H:%M:%S %z')] \"GET /HTTP/1.1\" 200 4897 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36\"" >> /var/log/nginx/access.log
122+
EOJ
123+
chmod +x genlog.sh
124+
125+
cat << EOT >> crontest.cron
126+
* * * * * ./genlog.sh
127+
EOT
128+
129+
crontab crontest.cron
130+
EOF
131+
)
132+
working_dir = "/root"
133+
type = "RunShellScript"
134+
timeout = 3600
135+
}
136+
137+
resource "alicloud_ecs_invocation" "invoke_script_nginx_loongcollector" {
138+
instance_id = [alicloud_instance.ecs_instance.id]
139+
command_id = alicloud_ecs_command.run_command_nginx_loongcollector.id
140+
timeouts {
141+
create = "15m"
142+
}
143+
depends_on = [alicloud_instance.ecs_instance]
144+
}
145+
146+
data "alicloud_log_service" "open" {
147+
enable = "On"
148+
}
149+
150+
resource "alicloud_log_project" "sls_project" {
151+
project_name = "sls-project-${local.common_name}"
152+
}
153+
154+
resource "alicloud_log_store" "sls_log_store" {
155+
logstore_name = "sls-logstore-${local.common_name}"
156+
project_name = alicloud_log_project.sls_project.project_name
157+
depends_on = [alicloud_log_project.sls_project]
158+
}
159+
160+
resource "alicloud_log_machine_group" "this" {
161+
identify_list = alicloud_instance.ecs_instance[*].primary_ip_address
162+
name = "lmg-${local.common_name}"
163+
project = alicloud_log_project.sls_project.project_name
164+
identify_type = "ip"
165+
}
166+
167+
resource "alicloud_logtail_config" "this" {
168+
project = alicloud_log_project.sls_project.project_name
169+
input_detail = <<EOF
170+
{
171+
"discardUnmatch": false,
172+
"enableRawLog": true,
173+
"fileEncoding": "utf8",
174+
"filePattern": "access.log",
175+
"logPath": "/var/log/nginx/",
176+
"logType": "common_reg_log",
177+
"maxDepth": 10,
178+
"topicFormat": "none"
179+
}
180+
EOF
181+
input_type = "file"
182+
logstore = alicloud_log_store.sls_log_store.logstore_name
183+
name = "lc-${local.common_name}"
184+
output_type = "LogService"
185+
}
186+
187+
resource "alicloud_logtail_attachment" "this" {
188+
project = alicloud_log_project.sls_project.project_name
189+
logtail_config_name = alicloud_logtail_config.this.name
190+
machine_group_name = alicloud_log_machine_group.this.name
191+
}
192+
193+
resource "alicloud_log_store_index" "sls_index" {
194+
project = alicloud_log_project.sls_project.project_name
195+
logstore = alicloud_log_store.sls_log_store.logstore_name
196+
full_text {
197+
token = " :#$^*\r\n\t"
198+
}
199+
field_search {
200+
name = "content"
201+
type = "text"
202+
token = " :#$^*\r\n\t"
203+
}
204+
depends_on = [alicloud_log_store.sls_log_store]
205+
}
206+
207+
data "alicloud_oss_service" "open" {
208+
enable = "On"
209+
}
210+
211+
resource "alicloud_ram_role" "log_default_role" {
212+
role_name = "log-default-role-${local.common_name}"
213+
assume_role_policy_document = <<EOF
214+
{
215+
"Statement": [
216+
{
217+
"Action": "sts:AssumeRole",
218+
"Effect": "Allow",
219+
"Principal": {
220+
"Service": [
221+
"log.aliyuncs.com"
222+
]
223+
}
224+
}
225+
],
226+
"Version": "1"
227+
}
228+
EOF
229+
}
230+
231+
resource "alicloud_ram_role_policy_attachment" "attach_policy_to_role" {
232+
role_name = alicloud_ram_role.log_default_role.role_name
233+
policy_type = "System"
234+
policy_name = "AliyunLogRolePolicy"
235+
}
236+
237+
resource "alicloud_oss_bucket" "oss_bucket" {
238+
bucket = "bucket-${local.common_name}"
239+
storage_class = "IA"
240+
force_destroy = true
241+
}
242+
243+
resource "alicloud_log_oss_export" "example" {
244+
project_name = alicloud_log_project.sls_project.project_name
245+
logstore_name = alicloud_log_store.sls_log_store.logstore_name
246+
export_name = "export-${local.common_name}"
247+
display_name = "display-${local.common_name}"
248+
bucket = alicloud_oss_bucket.oss_bucket.bucket
249+
prefix = "app01"
250+
suffix = ""
251+
buffer_interval = 300
252+
buffer_size = 250
253+
compress_type = "gzip"
254+
path_format = "%Y/%m/%d/%H/%M"
255+
content_type = "json"
256+
json_enable_tag = true
257+
role_arn = alicloud_ram_role.log_default_role.arn
258+
log_read_role_arn = alicloud_ram_role.log_default_role.arn
259+
time_zone = "+0800"
260+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
output "ecs_login_address" {
2+
description = "生成日志的ECS实例的登录地址。通过此地址登录ECS后,在本地查看生成日志文件的命令为:tail -f /var/log/nginx/access.log"
3+
value = format("https://ecs-workbench.aliyun.com/?from=ecs&instanceType=ecs&regionId=%s&instanceId=%s&resourceGroupId=", var.region, alicloud_instance.ecs_instance.id)
4+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
variable "region" {
2+
type = string
3+
default = "cn-hangzhou"
4+
}
5+
6+
variable "ecs_instance_type" {
7+
type = string
8+
default = "ecs.t6-c1m2.large"
9+
description = "实例类型"
10+
}
11+
12+
variable "ecs_instance_password" {
13+
type = string
14+
sensitive = true
15+
description = "服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)"
16+
}

0 commit comments

Comments
 (0)