自动化基础设施部署与容器技术实践
立即解锁
发布时间: 2025-08-26 01:53:05 阅读量: 16 订阅数: 26 AIGC 


Python for DevOps: Mastering Automation and Cloud Computing
### 自动化基础设施部署与容器技术实践
#### 1. 基础设施自动化部署
在基础设施自动化部署方面,我们可以使用Pulumi工具来完成一系列AWS资源的配置。
##### 1.1 当前栈资源与输出查看
首先,查看当前栈的资源:
```plaintext
Current stack resources (7):
TYPE NAME
pulumi:pulumi:Stack proj1-staging
pulumi:providers:aws default
aws:s3/bucket:Bucket s3-website-bucket
aws:s3/bucketPolicy:BucketPolicy bucket-policy
aws:s3/bucketObject:BucketObject index.html
aws:s3/bucketObject:BucketObject favicon.png
aws:s3/bucketObject:BucketObject python.png
```
查看当前栈的输出:
```plaintext
(venv) pulumi stack output
Current stack outputs (2):
OUTPUT VALUE
bucket_name s3-website-bucket-8e08f8f
website_url s3-website-bucket-8e08f8f.s3-website-us-east-1.amazonaws.com
```
可以通过访问`website_url`指定的URL(http://s3-website-bucket-8e08f8f.s3-website-us-east-1.amazonaws.com)来确认静态网站是否可以正常访问。
##### 1.2 为暂存栈创建配置值
当前栈为暂存栈,需要进行以下操作:
1. 将现有的`www`目录重命名为`www-staging`:
```bash
(venv) mv www www-staging
```
2. 使用`pulumi config set`命令为当前暂存栈指定两个配置值`domain_name`和`local_webdir`:
```bash
(venv) pulumi config set local_webdir www-staging
(venv) pulumi config set domain_name staging.devops4all.dev
```
查看现有配置值:
```bash
(venv) pulumi config
KEY VALUE
aws:region us-east-1
domain_name staging.devops4all.dev
local_webdir www-staging
```
在Pulumi代码中使用这些配置值:
```python
import pulumi
config = pulumi.Config('proj1') # proj1 is project name defined in Pulumi.yaml
content_dir = config.require('local_webdir')
domain_name = config.require('domain_name')
```
##### 1.3 配置ACM SSL证书
在配置ACM SSL证书时,Pulumi的Python SDK可能会有一些不直观的地方。可以参考TypeScript示例代码:
```typescript
const certificate = new aws.acm.Certificate("certificate", {
domainName: config.targetDomain,
validationMethod: "DNS",
}, { provider: eastRegion });
```
对应的Python代码如下:
```python
from pulumi_aws import acm
cert = acm.Certificate('certificate', domain_name=domain_name,
validation_method='DNS')
```
这里需要注意,从TypeScript移植到Python时,参数名从驼峰命名法变为蛇形命名法。
##### 1.4 配置Route 53区域和DNS记录
配置新的Route 53区域,使用以下代码:
```python
from pulumi_aws import route53
domain_name = config.require('domain_name')
# Split a domain name into its subdomain and parent domain names.
# e.g. "www.example.com" => "www", "example.com".
def get_domain_and_subdomain(domain):
names = domain.split(".")
if len(names) < 3:
return('', domain)
subdomain = names[0]
parent_domain = ".".join(names[1:])
return (subdomain, parent_domain)
(subdomain, parent_domain) = get_domain_and_subdomain(domain_name)
zone = route53.Zone("route53_zone", name=parent_domain)
```
创建DNS验证记录时,第一次尝试可能会遇到问题:
```python
cert = acm.Certificate('certificate',
domain_name=domain_name, validation_method='DNS')
domain_validation_options = cert.domain_validation_options[0]
cert_validation_record = route53.Record(
'cert-validation-record',
name=domain_validation_options.resource_record_name,
zone_id=zone.id,
type=domain_validation_options.resource_record_type,
records=[domain_validation_options.resource_record_value],
ttl=600)
```
会出现错误`AttributeError: 'dict' object has no attribute 'resource_record_name'`。通过将`domain_validation_options`对象添加到Pulumi导出列表中,可以解决这个问题:
```python
export('domain_validation_options', domain_validation_options)
```
正确的Python代码如下:
```python
cert_validation_record = route53.Record(
'cert-validation-record',
name=domain_validation_options['resourceRecordName'],
zone_id=zone.id,
type=domain_validation_options['resourceRecordType'],
records=[domain_validation_options['resourceRecordValue']],
ttl=600)
```
接着,创建证书验证完成资源:
```python
cert_validation_completion = acm.CertificateValidation(
'cert-validation-completion',
certificate_arn=cert.arn,
validation_record_fqdns=[cert_validation_dns_record.fqdn])
cert_arn = cert_validation_completion.certificate_arn
```
##### 1.5 配置CloudFront分发
配置CloudFront分发的代码如下:
```python
log_bucket = s3.Bucket('cdn-log-bucket', acl='private')
cloudfront_distro = cloudfront.Distribution ( 'cloudfront-distro',
enabled=True,
aliases=[ domain_name ],
origins=[
{
'originId': web_bucket.arn,
'domainName': web_bucket.website_endpoint,
'customOriginConfig': {
```
0
0
复制全文
相关推荐










