试着建立数据利用基础设施第六部分(构建和部署组成)
首先
您好,我是NTT数据先端技术的白木。本文是我为您介绍的数据活用基础设施构建系列文章的第六篇(构建和部署配置)。关于这个系列的工作内容,请参阅第一篇(构建方案)。前一篇文章请参阅第五篇(测试)。本文是构建部分的开始,将介绍在AWS上构建数据活用基础设施的部署配置。
目录
-
- 本記事について
-
- 前提
-
- 構築時の構成案
-
- リモートバックエンドの構築
-
- セキュアなアクセスキーの作成
-
- ローカル環境の構築
-
- 困った点
- 最後に
关于本篇文章
-
- 本記事で触れていること
Terraformを用いたAWSへの構築手順
リモートバックエンドの構築手順
AWSアクセスキーのIP制限について
ローカルにTerraformの実行環境を構築する手順
本記事で記載していないこと
AWS、Terraformの用語や詳しい説明
前提 tí) – premise, prerequisite
-
- TechlearningはSmall Startで進行
- メンバーは7名
构建时的构成方案
由于缺乏熟悉基础设施即代码(IaC)的成员,我们决定使用Terraform来学习并构建AWS环境。
另外,考虑到Small Start的项目规模,我们只准备了一个环境而不是多个。
现在我将介绍我们讨论的4个关于构建和部署配置以及代码管理的选项。
1. 一个负责部署的人员在本地进行管理。
我们指派一个部署人员,该人员负责执行部署并在本地进行状态管理。
-
- 簡易ですぐ始められ、アクセスキーが1つでよい点はメリット。
- ただ、デプロイ担当者の負担が大きく効率的ではない。
2. 远程后端的雇佣
采用远程后端技术,从各个环境中进行部署。
-
- Remote Backendには、S3とDynamoDBを採用。
-
- 各自がデプロイ可能になる点はメリット。
- 各作業者にIAMアクセスキーが必要になる。
使用git进行管理和远程后端的选择。
使用Git来管理Terraform代码,并通过远程后端管理Terraform的差异。
-
- Gitによるコード管理により、競合解決やデグレの防止ができる点はメリット。
-
- Gitサービスの構築が必要。各利用者にユーザー払い出しが必須。
※今回のPJでGitサービスを利用する場合は、社内で追加の使用許可等をとる必要がある。。
采用git管理和远程后端以及实现CI/CD
使用Git来管理代码,并在远程后端中管理Terraform的差异,然后进行CI/CD的实施以自动化部署。
-
- デプロイが安全かつ容易に実施できる。
- CI/CDの構築に工数がとられる。
选择的配置方案
整理了上述案件的表格如下所示。
由于这个项目是在Small Start上实施的,我们的前提是不希望在构建配置方面花费太多工作量。因此,我们否决了方案4的CI/CD构建,因为它的工作量太大。
另外,方案3的Git管理需要分配Git账户和提交使用申请的一段时间,因此也否决了该方案。方案1的本地管理会给负责人带来很大的负担,并且无法高效地进行开发,因此我们决定选择方案2,使用远程后台来构建环境。
远程后端构建
由于在构建时选择了使用远程后端,因此我将介绍远程后端的构建步骤。
这次我们选择将S3和DynamoDB作为远程后端来实现团队成员各自访问状态文件。
S3负责管理状态文件,而DynamoDB则用于实现同步控制。
另外,由于我们已经采用了Terraform,我本想将远程后端与创建的资源一起使用Terraform进行管理,但据说这样联合管理是不好的。
「Terraform是一种用于管理基础设施的工具。
因此,使用Terraform的基础设施需要存在于Terraform管理的基础设施之外。」
据参考报道,据说应该将Terraform使用的基础设施外部进行管理。
可以通过创建一个单独的管理AWS帐户,其中包括用于操作员使用的用户帐户以及用于管理其他帐户的基础架构和工具,来实现。
如果要在Terraform中管理远程Backend,需要创建一个新的AWS账户并在该账户中进行管理。尽管可以通过与AWS Organizations结合实现此目的,但由于账户分配等原因可能需要时间,因此我们决定手动构建Backend。(管理Terraform和手动构建的资源会有一些重叠,真是麻烦啊。。。)
以下是构建步骤。
S3建设步骤
-
- 在S3存储桶列表中点击“创建存储桶”
-
- 输入以下参数,并点击“创建存储桶”
存储桶名称:Remote-Backend-Bucket
AWS区域:ap-northeast-1
对象所有者:禁用ACL
此存储桶的公共访问块设置:阻止所有公共访问
存储桶版本控制:启用
默认加密:使用Amazon S3托管密钥的服务器端加密(SSE-S3)
存储桶策略:禁用
如何建置DynamoDB
-
- 点击表格列表中的“创建表格”,输入以下参数,并点击“创建表格”。
表格名称:远程后端表格
分区键:LockID,字符串类型
排序键:无
表格设置:默认设置
远程后端的Terraform配置将在后续的本地环境设置中进行说明。
创建安全的访问密钥
这次情况下,为了创建每个操作者的部署环境,需要发行相应的访问密钥。考虑到未采取任何安全措施的访问密钥可能会被泄露并被滥用,我们决定将仅限于交换角色权限的访问密钥分发,并对特定的IP地址进行了限制,只有从这些IP地址才能进行交换的安排。
切换规则 (Qiehuan
我們將Switch Role的配置設定如下:
從部署用戶端以特定IP限制的方式實現Switch功能,並授予管理員權限。
創建角色的參考來源如下:
參考)https://dev.classmethod.jp/articles/iam-switch-role-in-same-account/
IP限制流程
-
- スイッチ先のロールに特定IPのみの制限をかけるために、信頼関係にIPを記載します。
信頼されたエンティティ
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Principal”: {
“AWS”: “arn:aws:iam::{account_id}:root”
},
“Action”: “sts:AssumeRole”,
“Condition”: {
“IpAddress”: {
“aws:SourceIp”: [
“{IPアドレス}”,
“{IPアドレス}”
]
}
}
}
]
}
Condition句でIpAddressを指定することで特定のIP以外のアドレスからアクセスできないようになります。
本地环境配置
现在我们已经创建并部署了远程后端的访问密钥,可以开始构建每个人的本地环境了。
-
- version
Terraform : 5.5.0
provider : 1.5.2
以下是本次的建構步驟。
步骤
-
- 代理服务器设置
在每个环境中进行代理服务器设置。
由于我们有代理服务器限制,需要设置环境变量来绕过代理服务器。
代理服务器设置
$ env:http_proxy=”http://{用户名}:{密码}@{代理服务器地址}:{端口号}”
$ env:https_proxy=”http://{用户名}:{密码}@{代理服务器地址}:{端口号}”
Terraform
Terraform安装
从以下链接下载Windows的AMD64版本。
https://developer.hashicorp.com/terraform/downloads
解压并将terraform_1.2.2_windows_amd64保存在任意文件夹中
(我将其重命名为terraform并保存在/c/根目录下。)
配置环境变量
从Windows设置的“详细信息”中选择“系统属性”,然后选择“环境变量”。
选择“Path”并点击编辑。
选择“新建”并选择第2步中放置的文件夹。
如果可以执行terraform命令,则表示配置成功。
$ terraform -v
Terraform v1.5.1
on windows_amd64
+ provider registry.terraform.io/hashicorp/aws v5.5.0
您的Terraform版本已过时!最新版本为1.5.2。您可以通过从https://www.terraform.io/downloads.html下载来更新。
参考
https://dev.classmethod.jp/articles/kidapan-terraform-install/
AWS CLI
安装AWS CLI
通过以下官方链接下载安装程序。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
如果能够执行以下命令,则表示安装完成。
$ aws –version
aws-cli/2.12.3 Python/3.11.4 Windows/10 exe/AMD64 prompt/off
配置凭证
以交互方式进行输入
$ aws configure
AWS访问密钥ID [None]: 输入访问密钥
AWS密钥访问密钥 [None]: 输入秘密访问密钥
默认区域名称 [None]: ap-northeast-1
默认输出格式 [None]: json
检查配置文件,如果正确反映则表示配置成功
$ cat ~/.aws/config
[default]
region = ap-northeast-1
output = json
$ cat ~/.aws/credentials
[default]
aws_access_key_id = ~~~
aws_secret_access_key = ~~~
AWS CLI的assume role配置
由于当前用户没有权限且无法执行任何操作,因此需要在config中添加目标角色。
$ aws s3 ls
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
在~/aws/config中添加信息(配置文件名可以随意)
[default]
region = ap-northeast-1
output = json
[profile deploy]
role_arn = arn:aws:iam::{账户ID}:role/{角色名称}
source_profile = default
region = ap-northeast-1
output = json
将配置的profile设置为环境变量
※如果重新启动终端,请重新设置。
$ export AWS_DEFAULT_PROFILE=deploy
执行以下命令,如果返回结果,则表示配置成功
$ aws s3 ls
2023-07-03 16:10:40 Remote-Backend-Bucket
参考
https://dev.classmethod.jp/articles/installed_aws-cli_on_my_local_windows/
https://dev.classmethod.jp/articles/aws-cli-switch-role-script/
Terraform的assume role配置,Remote Backend配置
由于需要添加switch role的ARN,因此在provider.tf中进行如下配置。
此外,将创建的S3和DynamoDB用于backend的配置写入backend.tf。
provider.tf
provider “aws” {
region = “ap-northeast-1”
shared_credentials_files = [“$HOME/.aws/credentials”]
profile = “default”
# 添加assume_role块
assume_role {
role_arn = “arn:aws:iam::{账户ID}:role/{角色名称}”
}
}
terraform {
required_providers {
aws = {
source = “hashicorp/aws”
version = “~> 5.5.0”
}
}
required_version = “>= 1.5.2”
}
data “aws_region” “current” {}
data “aws_caller_identity” “current” {}
backend.tf
terraform {
backend “s3” {
bucket = “Remote-Backend-Bucket”
key = “terraform.tfstate”
region = “ap-northeast-1”
dynamodb_table = “Remote-Backend-Table”
shared_credentials_file = “$HOME/.aws/credentials”
# 添加role_arn选项
role_arn = “arn:aws:iam::{账户ID}:role/{角色名称}”
}
}
执行以下命令即可将S3和DynamoDB配置到Backend。
$ terraform init
$ terraform plan
$ terraform apply
令我困惑的地方
-
- 代码文件服务器管理
-
- 这次是一个小规模的开发,没有问题,但是当开发变得大规模时,我感到在文件服务器上管理代码是非常困难的。每次需要将修正内容反映到共享服务器上,并对旧版本进行重命名,需要手动合并其他团队成员所修复的内容。
-
- 在重复进行错误修复等过程中,由于每次都需要手动重命名最新版本和旧版本,这会变得很麻烦,可能会变得混乱,而且还有可能由于操作人员的判断而不反映最新版本。
-
- 因此,我认为在开发过程中,通过在一定程度上强制使用Git等工具来管理代码文件服务器,可以使管理更轻松,效率也会提高。
没有开发环境的问题
由于开发环境和生产环境是相同的,只有一个环境,在验证Glue job脚本时会影响到其他服务。尽管规模较小,但我觉得有多个环境会更安全,也更容易进行构建。
最后
非常感谢您的阅读至最后!本次我们介绍了使用Terraform构建AWS基础设施的步骤。希望本文对您有所帮助。如果有任何错误,请随意留言。下一章将介绍第七节(构建IAM)!