はじめに
なんだかんだプログラミングを始めて3年が経とうとしています。Qiitaは結構書く方ですがアドベントカレンダー参加は初です🎉
今回は2022年にやっぱり便利だよなと再実感した技術・ツールを皆さんに雑に紹介していきたいと思います。普段は大学生をしつつ、内定者アルバイトとしてSRE(Site Reliability Engineering)として仕事しているので少しインフラ寄りの技術・ツールの紹介になっています。ご了承ください。
さあ、雑に紹介していきますよ。
GitHub Actions
みんな大好きGitHubの一部の機能であるGitHub Actions。簡単に言うとワークフローを自動化するやつです。対抗馬として上がるのはCircleCIですが今後の開発においてはGitHub Actions一択でしょう。
実際のコードを見ていきましょう。
name: Deploy to Amazon ECS
on:
pull_request:
branches:
- main
types:
[closed]
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/repository:$IMAGE_TAG .
docker push $ECR_REGISTRY/repository:$IMAGE_TAG
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: .github/workflows/task-definition.json
container-name: container
image: ${{ steps.login-ecr.outputs.registry }}/container:${{ github.sha }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: service
cluster: cluster
wait-for-service-stability: true
上記のコードはmainブランチに出していたPRがMerge(close)されたら
mainブランチにチェックアウト -> AWS認証 -> ECRにログイン -> DockerイメージをBuild & ECRにPush -> タスク定義のimage書き換え -> タスク定義を更新
といったようにGitHubの操作をトリガーにしてCI/CDを構築できます。
先ほど紹介したCI/CDとしての役割だけでなく以下のように効率化や草の実績づくりとしても使えます。
- PRが生成されたら自動でレビューワーにアサインする
- 定期実行(cron)を使ってGitHubの草を生やす
Terraform
続いてはインフラをコード化(Infrastructure as Code)できるTerraformです。CloudFormationやAWS CDKなどと比較されることが多いですが個人的にはTerraformが一番好きです。
- 宣言的に記述できる
- インフラのCI/CDが実現できる
- 関連のOSSが充実している
- 様々なクラウドサービスに対応している(AWS, GCP, Datadog etc)
以上の4点がメリットです。特に関連のOSSが充実していることはとてもメリットだと感じています。中でも好きなOSSはtfsecとtfcmtです。
tfsec
tfsecはTerraformのセキュリティ静的解析ツールです。例えば、22番ポートを解放するといった記述をすると
resource "aws_security_group_rule" "accept22" {
security_group_id = aws_security_group.security_group.id
type = "ingress"
cidr_blocks = ["0.0.0.0/0"]
from_port = 22
to_port = 22
protocol = "tcp"
}
しっかり、叱ってくれます。どうしても無視したい場合はtfsec:ignore:ID
を対象resourceの上の行に記述すると無視できますよ。
もっと詳しく知りたい方はドキュメントがとても充実しているので参考にすると良いです。
tfcmt
tfcmtはterraform plan
, apply
の結果を GitHubのPRにいい感じにコメントしてくれるツールです。詳しいことは作者のZennを見ると良いですよ。
AWS Amplify
Amplifyは静的なWebサイトやSSRで動くNext.jsなどのホスティングに特化しているサービスです。
以前、SwaggerのUIをWebサイトとして皆んなで共有したいと思ったことがありました。しかし、認証を付けたり、CI/CDを構築する手間、金銭コストなどを考慮に入れると中々良いものは見つかりませんでした。
そこで、ピッタリ当てはまったのがAmplifyでした。以下の4点を実現し、非常に助かりました!
- 数クリックでGitHubと連携し、CI/CDも自動で組んでくれる
- Basic認証がかけれる(内部でCloudFrontとLambdaが使われているっぽい?)
- 既にSSL化されている
- ほぼ0円で運用できる
LucidChart
最後は一番好きでよく使っているLucidChartです。作図・資料作成などができるサービスで、エンジニアの場合だとER図やアーキテクチャ図などを書く際にめちゃくちゃ使えます。なんといっても使い心地が良すぎる。ぜひ、試してみてください!
無料枠は3つまでしか図を作成できないので要注意です。いつか課金したい...
なんとなく、LucidChartで書いたアーキテクチャ図でも載せておきます。
さいごに
本当に雑になってしまいましたが好評ならアドベントカレンダー中に第2弾出そうかなと思います!