便利だなと思う技術・ツールについて雑に紹介する

# はじめに

なんだかんだプログラミングを始めて3年が経とうとしています。Qiitaは結構書く方ですがアドベントカレンダー参加は初です🎉

今回は2022年にやっぱり便利だよなと再実感した技術・ツールを皆さんに雑に紹介していきたいと思います。普段は大学生をしつつ、内定者アルバイトとしてSRE(Site Reliability Engineering)として仕事しているので少しインフラ寄りの技術・ツールの紹介になっています。ご了承ください。

さあ、雑に紹介していきますよ。

## GitHub Actions

みんな大好きGitHubの一部の機能であるGitHub Actions。簡単に言うとワークフローを自動化するやつです。対抗馬として上がるのはCircleCIですが今後の開発においてはGitHub Actions一択でしょう。

実際のコードを見ていきましょう。

```yaml:
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の草を生やす

https://qiita.com/takatoshiinaoka/items/3e48ca8c82c2ebc91f46

https://github.co.jp/features/actions

## 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番ポートを解放するといった記述をすると

```terraform:
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の上の行に記述すると無視できますよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/f13398c7-4fc0-7483-fbc5-bc15a6aab718.png)

もっと詳しく知りたい方はドキュメントがとても充実しているので参考にすると良いです。

https://github.com/aquasecurity/tfsec

https://aquasecurity.github.io/tfsec/v1.28.1/

### tfcmt

tfcmtは`terraform plan`, `apply`の結果を GitHubのPRにいい感じにコメントしてくれるツールです。詳しいことは作者のZennを見ると良いですよ。

https://zenn.dev/shunsuke_suzuki/articles/improve-terraform-cicd-with-tfcmt

https://github.com/suzuki-shunsuke/tfcmt

## AWS Amplify

Amplifyは静的なWebサイトやSSRで動くNext.jsなどのホスティングに特化しているサービスです。

以前、SwaggerのUIをWebサイトとして皆んなで共有したいと思ったことがありました。しかし、認証を付けたり、CI/CDを構築する手間、金銭コストなどを考慮に入れると中々良いものは見つかりませんでした。

そこで、ピッタリ当てはまったのがAmplifyでした。以下の4点を実現し、非常に助かりました！

- 数クリックでGitHubと連携し、CI/CDも自動で組んでくれる
- Basic認証がかけれる(内部でCloudFrontとLambdaが使われているっぽい？)
- 既にSSL化されている
- ほぼ0円で運用できる

https://aws.amazon.com/jp/amplify

https://zenn.dev/yui/articles/5d49cbdf56c68f

## LucidChart

最後は一番好きでよく使っているLucidChartです。作図・資料作成などができるサービスで、エンジニアの場合だとER図やアーキテクチャ図などを書く際にめちゃくちゃ使えます。なんといっても使い心地が良すぎる。ぜひ、試してみてください！

https://www.lucidchart.com/pages/ja/landing?utm_source=google&utm_medium=cpc&utm_campaign=_chart_ja_allcountries_mixed_search_brand_bmm_&km_CPC_CampaignId=1532901516&km_CPC_AdGroupID=58843223019&km_CPC_Keyword=%2Blucid%20%2Bcharts&km_CPC_MatchType=b&km_CPC_ExtensionID=&km_CPC_Network=g&km_CPC_AdPosition=&km_CPC_Creative=290872661225&km_CPC_TargetID=kwd-309981172269&km_CPC_Country=1009698&km_CPC_Device=c&km_CPC_placement=&km_CPC_target=&gclid=Cj0KCQiAvqGcBhCJARIsAFQ5ke5IASR5Xs8xxz0w2fp2XzjBG_sZjpHsu5DAmTJEmnkoHUhA48qr4SsaAq2NEALw_wcB

無料枠は3つまでしか図を作成できないので要注意です。いつか課金したい...

なんとなく、LucidChartで書いたアーキテクチャ図でも載せておきます。

![encer (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/4aa7972b-e4e8-8fc1-e017-eb3bb7a1f96e.png)

# さいごに

本当に雑になってしまいましたが好評ならアドベントカレンダー中に第２弾出そうかなと思います！