はじめに
AWS の CodeCommit を使用してソース管理をしていますが、CodeCommitとGitの設定情報に関して基礎から理解できていなかったため、改めて調べたことを備忘録として残します。恐らく初学者向けです。
概要
- git config
- AWS CLI に関するファイル
- ~/.aws/config
- ~/.aws/credentials
- プロファイルの設定
- git config の認証情報に AWSのプロファイルを設定
- 元々やりたかったこと
- 実際に起きていたこと
- 補足
git config
git config は Gitの設定を行うためのコマンドになり、ここで設定した内容は .gitconfig
ファイルに保存されます。
例えば、git config user.email
と実行し、メールアドレスuser@mail.com
を入力すると、
[user]
email = user@mail.com
というように設定されます。
また、設定されるconfigファイルは大きく3種類あり、それぞれlocal
、global
、system
で対象の範囲が異なります。
種類 | 対象範囲 | 場所(Windows) | 場所(Mac) | 備考 |
---|---|---|---|---|
system | システム全体(全ユーザーの全リポジトリ) | [gitインストール先]¥etc¥gitconfig [gitインストール先]¥mingw64¥etc¥gitconfig 一般的な場所 C:¥Program Files¥Git¥etc¥gitconfig C:¥Program Files¥Git¥mingw64¥etc¥gitconfig C:¥Program Files (x86)¥Git¥etc¥gitconfig C:¥Program Files (x86)¥Git¥mingw64¥etc¥gitconfig |
一般的な場所 /usr/local/etc/gitconfig /usr/local/git/etc/gitconfig |
- |
global | 該当ユーザーの全リポジトリ | C:¥Users¥[ユーザー名]¥.gitconfig | ~/.gitconfig | ホーム直下 |
local | 該当リポジトリ | [リポジトリのルートディレクトリ]¥.git¥config | [リポジトリのルートディレクトリ]/.git/config | リポジトリの.git 直下 |
そのため、それぞれの範囲別に値を設定したい場合は、git config --global <name>
のようにオプションが必要になります。
色々な設定がありますが、設定を変更したい場合は、コマンドから変更しても直接設定ファイルを書き換えてもどちらでも大丈夫です。
項目 | オプション | 備考 |
---|---|---|
ユーザー名 | user.name | |
メールアドレス | user.email | |
デフォルトのpush方式(nothing) | push.default current | git push origin masterのように常にpush元と先を指定する |
デフォルトのpull方式(false) | pull.ff false | fast-forwardかどうかに関わらず常にマージコミットを作成する。(= git pull --no-ff) |
デフォルトのブランチ名 | init.defaultBranch | |
認証ヘルパーの読み込み | credential.helper | AWSのプロファイル等を指定することも可能 |
【参考資料】
AWS CLI に関するファイル
AWS CLIはコマンドラインからAWSリソースを管理するためのコマンドラインツールですが、どのAWS環境にアクセスするかといった情報を設定する必要があります。
AWS CLIをインストールした直後はまだありませんが、aws configure
を実行し、必要な情報を入力することで
~/.aws/config
~/.aws/credentials(※アクセスキーとシークレットアクセスキーを入力した場合)
の2つの設定ファイルが生成され、設定した情報のAWS環境へアクセスすることができるようになります。
[default]
region = ap-northeast-1
output = json
[default]
aws_access_key_id = *********************
aws_secret_access_key = ******************************
※入力したアクセスキーやシークレットアクセスキーは漏洩しないように管理しましょう。
プロファイルの設定
上記の場合、aws configure
というように名前を指定せずに設定したので[default]
の項目に値が設定されました。
これはプロファイルを指定しなかった時に読み込まれる情報という意味になりますが、権限ごとにプロファイルを分けて設定することができます。
aws configure --profile プロファイル名(今回はtest)
とすると、下記のように指定した名前で新たなプロファイルが作成されます。
[default]
region = ap-northeast-1
output = json
[test]
region = ap-northeast-1
output = json
[default]
aws_access_key_id = *********************
aws_secret_access_key = ******************************
[test]
aws_access_key_id = *********************
aws_secret_access_key = ******************************
例えば上記の設定内容であるコマンドを実行したい場合は、
aws 何かしらのコマンド --profile test
とすることでtest
の認証情報でコマンドを実行することが可能になります。
aws 何かしらのコマンド
だけの場合は、default
のプロファイルが適用されます。
git config の認証情報に AWSのプロファイルを設定
前項でお伝えした~/.aws/credentials
にアクセスキーやシークレットアクセスキーが設定されていれば git コマンドでCodeCommit上のリポジトリにアクセスすることができますが、
今回は上記のキーを設定していない状態で、CodeCommitの認証にSSOを使用したいと思います。
そのためには、まず ~/.aws/config
ファイルにSSOの情報を記載します。
[profile プロファイル名]
sso_start_url = SSO作成時に払い出されたURL
sso_region = ap-northeast-1
sso_account_id = SSOを作成したAWSのアカウントID
sso_role_name = SSOを作成したロール名
region = ap-northeast-1
output = json
そして、~/.gitconfig
ファイルに [credential]
の項目を追加します。
[user]
name = user_name
email = user@mail.com
# 追加
[credential]
helper = !aws --profile プロファイル名 codecommit credential-helper $@
UseHttpPath = true
このようにすることで、git コマンドで CodeCommitのリポジトリにアクセスした際、SSOの認証が切れていればアクセスが不可になります。
認証が切れていれば aws sso login --profile プロファイル名
で再度認証することができます。
これでローカルのファイルにアクセスキーやシークレットアクセスキーを保存しておく必要がなくなりました。
※AWS SSO の認証情報のキャッシュは ~/.aws/cli/cache
と ~/.aws/sso/cache
に保存されます。
元々やりたかったこと
元々は上記でご説明したように、CodeCommitのリポジトリにgitコマンドでアクセスする時に AWS SSOの認証が必要である仕組みを作るつもりでした。
実際に起きていたこと
しかし、SSOの有効期限が切れてもgit fetch
等のリポジトリの参照処理ができてしまうという状況が起きていました。
IAMユーザーに「AWS CodeCommit の HTTPS Git 認証情報」というものが設定されていましたが(画像は削除済み)、これのせいでSSOなど関係なく、初回でIDとパスワードを入力すればHTTPSでGitの認証ができてしまっていました。
しかも ~/.gitconfig
の内容が
[credential]
helper = !aws codecommit credential-helper $@
UseHttpPath = true
となっており、プロファイルが設定されていなかったのでそりゃできないですね。
そのため、.gitconfig の見直しとHTTPS Git 認証情報の削除によって予定通りに動作するようになりました。
補足
筆者の開発環境は Windows と Macbook の2種類ありますが、Macbook側にはデフォルトのApple Gitがインストールされていました。
そのためホームディレクトリ配下に .gitconfig
なるものが存在せず、どこかしらに設定ファイルがあると思い探しましたが見つからなかったので Homebrew 経由で Git をインストールしました。
Apple Git でも .gitconfig のように設定する方法について、わかる方がいればコメントいただけると幸いです。
最後に
業務でちょこちょこAWSは触っていましたが、IAMを含めた認証や権限周りの仕組みや設定がかなり難しく、初学者の参入障壁になっているような気がします...
【参考記事】