准备 VSCode、GitHub Actions 和 Terraform
在社外社区和AWS峰会上,我看到了很多使用GitHub和Terraform构建AWS基础设施的案例。今次的目的是为自己搭建一个开发环境。此外,最近有关许可证的公告我不打算提及。
准备 VSCode + GitHub Actions + Terraform
预先安装
安装 Git
Windows 的情况下需要从下面的链接进行安装。
https://gitforwindows.org/
Terraform 模块部署
然后,您就可以使用terraform -v命令了。
PS C:\GitHub> terraform -v
Terraform v1.5.5
on windows_amd64
PS C:\GitHub>
PS C:\GitHub\terraform> terraform -v
Terraform v1.5.5
on windows_amd64
PS C:\GitHub\terraform>
在VSCode中安装扩展插件。
-
- HashiCorp Terraform
-
- GitHub Pull Requests and Issue
-
- Markdown Preview Github Styling
- GitHub Actions
克隆git库
使用VSCode的终端将存储库复制到本地。
PS C:\GitHub> git clone https://github.com/***/terraform.git
Cloning into 'terraform'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
PS C:\GitHub>
发行并下载IAM用户的CLI访问密钥。
因为我过去已经安装过这个CLI,所以这次将省略安装步骤。
此外,在上述指南中
第一步:创建强制使用 MFA 登录策略
(省略)
选择 [JSON] 选项卡,从以下的 JSON 策略文档中复制文本。允许经过 AWS: MFA 认证的 IAM 用户在 [我的安全凭证] 页面上管理自己的认证凭据。
有了以下的策略并分配给CLI,您可以强制进行MFA。
为了避免偏离话题,我希望从我们已经确认的部分开始说。
执行terraform命令
首先,在.terraform文件夹的VPC创建级别中创建main.tf。
resource "aws_vpc" "main" {
cidr_block = "10.10.0.0/16"
tags = {
Name = "terraform-vpc"
}
}
在执行terraform命令时,它会读取当前目录中的所有tf文件并执行,由于没有指定文件名,所以将其命名为main.tf。
在这种情况下,我们从main.tf所在的目录执行以下命令。
terraform init
有关 terraform init,请参阅此处的说明。
由于需要放置 exe 文件并进行首次运行,因此需要预先初始化命令。
terraform plan
有关terraform plan的信息可以在此处找到。
目前,main.tf文件中的资源和在AWS实际机器上的差异将被输出。
PS C:\GitHub\terraform\.terraform> terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_vpc.main will be created
+ resource "aws_vpc" "main" {
+ arn = (known after apply)
+ cidr_block = "10.10.0.0/16"
+ default_network_acl_id = (known after apply)
+ default_route_table_id = (known after apply)
+ default_security_group_id = (known after apply)
+ dhcp_options_id = (known after apply)
+ enable_dns_hostnames = (known after apply)
+ enable_dns_support = true
+ enable_network_address_usage_metrics = (known after apply)
+ id = (known after apply)
+ instance_tenancy = "default"
+ ipv6_association_id = (known after apply)
+ ipv6_cidr_block = (known after apply)
+ ipv6_cidr_block_network_border_group = (known after apply)
+ main_route_table_id = (known after apply)
+ owner_id = (known after apply)
+ tags = {
+ "Name" = "terraform-vpc"
}
+ tags_all = {
+ "Name" = "terraform-vpc"
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
PS C:\GitHub\terraform\.terraform>
如果没有问题,就使用Terraform apply来应用。
PS C:\GitHub\terraform\.terraform> terraform apply
(差分出力省略)
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_vpc.main: Creating...
aws_vpc.main: Creation complete after 1s [id=vpc-02209b094c4b015b0]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
PS C:\GitHub\terraform\.terraform>
所以,我们成功地创建了VPC。
GitHub 的设置。
.gitignore 文件
首先,我相信在VSCode上查看本地文件時,您可能會發現有幾個文件增加了。
通常情況下,Terraform會將terraform.tfstate和.terraform.lock.hcl文件放在本地,存在意外將它們推送到GitHub的風險。
因此,您可以將這些文件名登錄到.gitignore文件中,明確地設置不將它們推送。
terraform.exe
terraform.tfstate
.terraform.lock.hcl
GitHub与AWS的集成。
在这里做的是根据以下指南进行的。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::(略):oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:"オーナー名"/"リポジトリ名":*"
}
}
}
]
}
3. 在GitHub上注册角色
为了不在公共存储库中直接将IAM角色的ARN写入代码中,需要在GitHub的secret中进行注册。
进入GitHub的设置 > Secret and Variable > Actions,进入以下页面。
选择绿色的”New repository secret”。
名称:AWS_ROLE_ARN
密钥:在”2.创建信任OIDC提供程序的IAM角色”中创建的IAM角色的ARN
创建GitHub Actions的配置文件。
name: 'GitHubActions-Terraform'
#ワークフロー実施のトリガーはmainブランチにpushされたとき
on:
push:
branches:
- "main"
#ワークフロー内のジョブグループ
jobs:
#ジョブID
apply_tf:
#ジョブ名
name: Terraform apply
#ジョブ実行するマシンのタイプ
runs-on: ubuntu-latest
#ジョブの権限設定
permissions:
id-token: write
contents: read
#タスクのグループ
steps:
- name: set ROLE
run: |
echo "AWS_ROLE_ARN=$" >> $GITHUB_ENV
#GitHubの公式アクション、CI/CDを実行するサーバへチェックアウト
#https://github.com/actions/checkout
- name: Checkout
uses: actions/checkout@v3
#AWS公式のアクション、AWSへの認証
#https://github.com/aws-actions/configure-aws-credentials
- name: configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: ${{secrets.AWS_ROLE_ARN}}
aws-region: ap-northeast-1
#hashicorpの公式のアクション
#https://github.com/hashicorp/setup-terraform
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: ~1.2.0
- name: Terraform Init
run: terraform init
working-directory: .terraform #.terraformにtfファイルがあるため
- name: Terraform Apply
run: terraform apply -auto-approve
working-directory: .terraform #.terraformにtfファイルがあるため
将更改合并到主分支
创建后台部分
我希望在验证环境中创建并满意后,通过使用 terraform destroy 命令来删除资源并结束配置。
这样一来,我们就需要使用 terraform 创建用于后端的 S3,并且必须注意执行 terraform destroy 的时候。所以,让我们使用 CloudFormation 进行创建吧。
AWSTemplateFormatVersion: 2010-09-09
Description: CloudFormation template for Terraform S3 backend
########################################################################
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
AccessControl: Private
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
VersioningConfiguration:
Status: Enabled
TerraformS3BackendPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: s3:ListBucket
Resource: !GetAtt S3Bucket.Arn
- Effect: Allow
Action:
- s3:GetObject
- s3:PutObject
- s3:DeleteObject
Resource: !Sub ${S3Bucket.Arn}/*
Outputs:
S3Bucket:
Value: !Ref S3Bucket
我想将此处创建的 S3 作为 backend,请在 main.tf 目录下创建 backend.tf。
terraform {
required_version = "1.5.5"
backend "s3" {
bucket = "バケット名"
key = "terraform.tfstate"
region = "ap-northeast-1"
}
}
我将尝试使用VSCode从头创建VCP,并应用Terraform。
PS C:\GitHub\terraform\.terraform> terraform apply
aws_vpc.main:正在刷新状态… [id = vpc-02209b094c4b015b0]Terraform 使用已选择的提供商生成以下执行计划。使用以下符号表示资源操作:
+ 创建
Terraform 将执行以下操作:
# aws_vpc.main 将被创建
+ 资源 “aws_vpc” “main” {
+ arn =(应用后已知)
+ cidr_block = “10.10.0.0/16”
+ default_network_acl_id =(应用后已知)
+ default_route_table_id =(应用后已知)
+ default_security_group_id =(应用后已知)
+ dhcp_options_id =(应用后已知)
+ enable_dns_hostnames =(应用后已知)
+ enable_dns_support = true
+ enable_network_address_usage_metrics =(应用后已知)
+ id =(应用后已知)
+ instance_tenancy = “default”
+ ipv6_association_id =(应用后已知)
+ ipv6_cidr_block =(应用后已知)
+ ipv6_cidr_block_network_border_group =(应用后已知)
+ main_route_table_id =(应用后已知)
+ owner_id =(应用后已知)
+ tags = {
+ “Name” = “terraform-vpc”
}
+ tags_all = {
+ “Name” = “terraform-vpc”
}
}
计划:添加 1 个,更改 0 个,销毁 0 个。
您要执行这些操作吗?
Terraform 将执行上述操作。
只接受 ‘yes’ 来批准。
输入一个值:是
aws_vpc.main:正在创建…
aws_vpc.main:创建完成后 1s [id = vpc-010f8818d04c4a235]
应用完成!资源:已添加 1 个,已更改 0 个,已销毁 0 个。
PS C:\GitHub\terraform\.terraform>
aws_vpc.main: 刷新状态… [id=vpc-010f8818d04c4a235]
Terraform使用选定的提供程序生成以下执行计划。资源操作用以下符号表示:
删除
Terraform将执行以下操作:
将aws_vpc.main销毁
resource “aws_vpc” “main” {
arn = “arn:aws:ec2:ap-northeast-1:446531955624:vpc/vpc-010f8818d04c4a235” -> null
assign_generated_ipv6_cidr_block = false -> null
cidr_block = “10.10.0.0/16” -> null
default_network_acl_id = “acl-0fc822dbd539b2001” -> null
default_route_table_id = “rtb-0c6ee00e2310b39fb” -> null
default_security_group_id = “sg-0788a5f35a051edf8” -> null
dhcp_options_id = “dopt-0c1401298c9af1787” -> null
enable_dns_hostnames = false -> null
enable_dns_support = true -> null
enable_network_address_usage_metrics = false -> null
id = “vpc-010f8818d04c4a235” -> null
instance_tenancy = “default” -> null
ipv6_netmask_length = 0 -> null
main_route_table_id = “rtb-0c6ee00e2310b39fb” -> null
owner_id = “446531955624” -> null
tags = {
“Name” = “terraform-vpc”
} -> null
tags_all = {
“Name” = “terraform-vpc”
} -> null
}
计划: 要添加0个,要更改0个,要销毁1个。
您确定要销毁所有资源吗?
Terraform将销毁所有管理的基础架构,如上所示。
这是不可撤销的。只能接受’yes’以确认。
输入一个值:是
aws_vpc.main: 正在销毁… [id=vpc-010f8818d04c4a235]
aws_vpc.main: 在0秒后销毁完成
销毁完成!资源:1个已销毁。
PS C:\GitHub\terraform.terraform>
结束
因此,这是为了使用GitHub Actions进行构建准备。
如果您熟练使用它,我认为您会将其配置为在将项目推送到main分支之前执行terraform计划。
但是,首先我调查了环境搭建并进行了创建。
另外,我努力将存储桶名称放入环境变量中,以防止将其上传到GitHub,但我感觉我的知识还不够。
总之,我能够创建环境,所以我希望在接下来的过程中能改进。