Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ニフティ開発インターンで使うAWS環境をできるだけ楽に構築した話 (LT) - NIFTY Tech Day 2023

ニフティ開発インターンで使うAWS環境をできるだけ楽に構築した話 (LT) - NIFTY Tech Day 2023

ニフティ株式会社

November 29, 2023
Tweet

More Decks by ニフティ株式会社

Other Decks in Programming

Transcript

  1. Copyright ©NIFTY Corporation All Rights Reserved.
    ニフティ開発インターンで使う
    AWS環境を
    できるだけ楽に構築した話
    会員システムグループ 第二開発チーム
    上原 直希

    View full-size slide

  2. ニフティで開発インターンシップを開催
    ● 8月に開発インターンを開催
    ● 学生はチームに分かれ、3日間チーム開発
    ● スクラムの原則に則って活動してもらう

    View full-size slide

  3. インターン中の学生の開発の流れ
    ● 学生のPCでソースコードを追加・修正
    ● IAMユーザーを使ってAWS CodeCommitにpushしPR作成
    ● チームメンバーおよびメンター社員がPRをレビュー
    ● 大丈夫そうであればマージ、デプロイ
    ● 上の繰り返し

    View full-size slide

  4. 運営としてインフラを色々いじっていた
    ● インターンの運営として関わる
    ● インフラ構築が大変そうだったので、
    いい感じにできないか?
    ● 一ヶ月くらいTerraformをゴニョゴニョいじっていく

    View full-size slide

  5. 紹介したいところ
    1. 学生に払い出すIAMユーザーのパスワードをボタンぽちぽちせずに
    払い出したい
    2. 開催時間以外は学生がリソースにアクセスできないようにしたい
    3. AWS CodeCommitのmasterブランチに直pushできないようにしたい
    4. AWS CodeCommitでPRは必ず社員の承認を得てからマージできるよ
    うにしたい

    View full-size slide

  6. IAMユーザーのパスワード払い出し

    View full-size slide

  7. ポチポチして30人分のパスワードを発行する...
    面倒

    View full-size slide

  8. コンソールログイン用のパスワード払い出し
    aws_iam_user_login_profile
    resource "aws_iam_user" "example" {
    name = "example"
    path = "/"
    for
    ce_destroy = true
    }
    resource "aws_iam_user_login_profile" "example" {
    user = aws_iam_user.example.name
    pgp_key = "keybase:some_person_that_exists"
    }
    IAMユーザー作成
    コンソールログイン
    用のパスワード払い
    出し

    View full-size slide

  9. .encrypted_passwordで
    生成したパスワードを参照可能
    aws_iam_user_login_profile
    resource "aws_iam_user_login_profile" "example" {
    user = aws_iam_user.example.name
    pgp_key = "keybase:some_person_that_exists"
    }
    パスワード払い出し
    (暗号化キーも指定)
    output "password" {
    value = aws_iam_user_login_profile.example.encrypted_password
    }
    暗号化されたパスワード
    を参照可能

    View full-size slide

  10. Gitクライアント用の認証情報の払い出し
    aws_iam_service_specific_credential
    resource "aws_iam_service_specific_credenBal" "example" {
    service_name = "codecommit.amazonaws.com"
    user_name = aws_iam_user.example.name
    }
    output "codecommit_user_name" {
    value = aws_iam_service_specific_credential.example.service_user_name
    }
    output "codecommit_password" {
    value = aws_iam_service_specific_credential.example.service_user_password
    }
    Git用認証情報
    Git認証用の
    ID/パスワード

    View full-size slide

  11. Terraform便利!
    コンソールに入らずにパスワードを払い出せるので便利!

    View full-size slide

  12. アクセス可能時間を制御したい!

    View full-size slide

  13. IAMユーザーのアクセス可能時間制御
    ● インターン時間外にはコンソールやAWS CodeCommitにアクセスして
    欲しくない
    ● 開始時間になったらアクセスできるようIAMポリシーを付ける、
    終わったら外す
    ○ 手動でやるの面倒

    View full-size slide

  14. IAMユーザーのアクセス可能時間制御
    ● IAMポリシーにConditionがあ

    ● Conditionに時間制限をかけら
    れる
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Sid": "VisualEditor0",
    "Effect": "Allow",
    "Action": [
    "*"
    ],
    "Resource": "*",
    "Condition": {
    "DateGreaterThan": { "aws:CurrentTime": "${start}" },
    "DateLessThan": { "aws:CurrentTime": "${end}" }
    }
    }
    ]
    }

    View full-size slide

  15. IAMユーザーのアクセス可能時間制御
    ● 現在時刻が開始時間から終了時間の間までポリシーが適用される
    "CondiBon": {
    "DateGreaterThan": { "aws:CurrentTime": "開始時間" },
    "DateLessThan": { "aws:CurrentTime": "終了時間" }
    }

    View full-size slide

  16. IAMユーザーのアクセス可能時間制御
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Sid": "VisualEditor0",
    "Effect": "Allow",
    "AcKon": [
    "codecommit:GitPush"
    ],
    "Resource": "arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo",
    "CondiKon": {
    "DateGreaterThan": { "aws:CurrentTime": "2024-09-21T09:00:00+09:00" },
    "DateLessThan": { "aws:CurrentTime": "2024-09-21T17:00:00+09:00" }
    }
    }
    ]
    }
    学生が使うIAMユーザーは
    9/21の9:00-17:00で
    MyDemoRepoに
    pushのみ
    可能

    View full-size slide

  17. masterにpushして欲しくない

    View full-size slide

  18. AWS CodeCommitのmasterに直push禁止
    GitHub
    ブランチ保護ルールを使う
    =レポジトリに設定
    AWS CodeCommit
    IAMポリシーでIAMユーザーの
    権限を制限
    =ユーザー単位の制限
    (=レポジトリに設定できない)

    View full-size slide

  19. AWS CodeCommitのmasterに直push禁止
    masterに対してpush禁止を
    示すIAMポリシーを作成
    →ユーザーにアサインすれば、
    そのユーザーはpushできない
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Deny",
    "AcKon": ["codecommit:GitPush"],
    "Resource": "*",
    "CondiKon": {
    "StringEqualsIfExists": {
    "codecommit:References": ["refs/heads/master"]
    },
    "Null": {
    "codecommit:References": false
    }
    }
    }
    ]
    }
    https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_awscodecommit.html

    View full-size slide

  20. 社員が承認してからマージしたい

    View full-size slide

  21. GitHub
    ブランチ保護ルール
    AWS CodeCommitでは承認ルールを使う
    AWS CodeCommit
    承認ルール

    View full-size slide

  22. 承認ルールの面倒なところ
    承認ルールはPRごとに設定しないといけないので、面倒
    → 承認ルールテンプレートを使えば自動的に設定してくれる

    View full-size slide

  23. 承認ルールテンプレートはこんな感じ
    何人承認必要か
    誰からの承認が
    必要か
    マージ先のブランチ
    (master, mainの
    指定が多い)

    View full-size slide

  24. レビュアーにはロール名/スイッチ元ユーザ
    ー名で指定する
    https://dev.classmethod.jp/articles/codecommit-approval-rule-tips/

    View full-size slide

  25. 社員からの承認を必須にするには
    社員はAdministratorロールが取れるので、
    承認プールにはAdministrator/*と指定
    →学生のIAMユーザーはApproveしても
    条件を満たさないためマージできない

    View full-size slide

  26. Terraformで承認ルールテンプレートを作る時
    ハマりポイント
    resource "aws_codecommit_approval_rule_template" "approval_rule" {
    name = "approval-rule"
    description = "承認テンプレート"
    content = <{
    "Version": "2018-11-08",
    "DestinationReferences": ["refs/heads/master", "refs/heads/main"],
    "Statements": [{
    "Type": "Approvers",
    "NumberOfApprovalsNeeded": 1,
    "ApprovalPoolMembers": ["CodeCommitApprovers:Administrator/*"]
    }]
    }
    EOF
    }
    CodeCommitApprovers:がprefixに必要
    × Administrator/*

    View full-size slide

  27. 紹介したこと
    ● 学生に払い出すIAMユーザーの認証情報をぽちぽちせずに払い出し
    たい
    ● 指定時間以外は学生がAWS CodeCommitにアクセスできないように
    したい
    ● AWS CodeCommitのmasterブランチに直pushできないようにしたい
    ● AWS CodeCommitでPRは必ず社員の承認を得てからマージできるよ
    うにしたい

    View full-size slide

  28. まとめ
    ● Terraformを使って簡単にパスワードを払い出せる
    ○ IaC最高
    ● IAMポリシーのConditionで時間帯によるアクセス制御ができる
    ● AWS CodeCommitに制限をかける時はIAMや承認ルールテンプレー
    トを駆使していきましょう

    View full-size slide