准备 VSCode、GitHub Actions 和 Terraform

在社外社区和AWS峰会上,我看到了很多使用GitHub和Terraform构建AWS基础设施的案例。今次的目的是为自己搭建一个开发环境。此外,最近有关许可证的公告我不打算提及。

 

准备 VSCode + GitHub Actions + Terraform

预先安装

安装 Git

Windows 的情况下需要从下面的链接进行安装。
https://gitforwindows.org/

Terraform 模块部署

image.png
image.png

然后,您就可以使用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> 

image.png

发行并下载IAM用户的CLI访问密钥。

image.png
image.png

因为我过去已经安装过这个CLI,所以这次将省略安装步骤。

 

此外,在上述指南中

第一步:创建强制使用 MFA 登录策略
(省略)
选择 [JSON] 选项卡,从以下的 JSON 策略文档中复制文本。允许经过 AWS: MFA 认证的 IAM 用户在 [我的安全凭证] 页面上管理自己的认证凭据。

有了以下的策略并分配给CLI,您可以强制进行MFA。

 

为了避免偏离话题,我希望从我们已经确认的部分开始说。

执行terraform命令

image.png

首先,在.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。

image.png

GitHub 的设置。

.gitignore 文件

首先,我相信在VSCode上查看本地文件時,您可能會發現有幾個文件增加了。

通常情況下,Terraform會將terraform.tfstate和.terraform.lock.hcl文件放在本地,存在意外將它們推送到GitHub的風險。

因此,您可以將這些文件名登錄到.gitignore文件中,明確地設置不將它們推送。

terraform.exe
terraform.tfstate
.terraform.lock.hcl

GitHub与AWS的集成。

在这里做的是根据以下指南进行的。

 

image.png
{
    "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:"オーナー名"/"リポジトリ名":*"
                }
            }
        }
    ]
}
image.png

3. 在GitHub上注册角色
为了不在公共存储库中直接将IAM角色的ARN写入代码中,需要在GitHub的secret中进行注册。
进入GitHub的设置 > Secret and Variable > Actions,进入以下页面。
选择绿色的”New repository secret”。
名称:AWS_ROLE_ARN
密钥:在”2.创建信任OIDC提供程序的IAM角色”中创建的IAM角色的ARN

创建GitHub Actions的配置文件。

image.png
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ファイルがあるため

将更改合并到主分支

image.png

创建后台部分

我希望在验证环境中创建并满意后,通过使用 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。

开始执行 terraform apply 命令
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>

image.png
执行terraform destroyPS C:\GitHub\terraform.terraform> terraform destroy
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,但我感觉我的知识还不够。
总之,我能够创建环境,所以我希望在接下来的过程中能改进。

广告
将在 10 秒后关闭
bannerAds