ããã«ã¡ã¯ð
æ ªåŒäŒç€ŸããããŠã¬ã®@YushiYamamotoã§ãïŒ
ãããããµã€ãã®éçºã»éå¶ãæ
åœããªãããAIã»æ¥åèªååå°éã®ãã«ã¹ã¿ãã¯ã»ããªãŒã©ã³ã¹ãšã³ãžãã¢ãšããŠã掻åããŠããŸãâïž
ð èšäºãµããªãŒ
ãã®èšäºã§ã¯ãå€ãã®éçºè ãé¥ããã¡ãªããã©ã€ããŒããªããžããªãªã.envãã¡ã€ã«ãã³ãããããŠã倧äžå€«ããšããå±éºãªèª€è§£ã«ã€ããŠè§£èª¬ããŸããå®éã®çŸå Žçµéšã«åºã¥ããã»ãã¥ãªãã£ãªã¹ã¯ãããã¢ãã³ãªããŒã«ã掻çšããå®å šãªç°å¢å€æ°ç®¡çãŸã§ãåå¿è ããäžçŽè ãŸã§åœ¹ç«ã€å®è·µçãªå 容ããå±ãããŸãð¡ïž
ãã®èšäºã§åŸãããããšïŒ
- ãã©ã€ããŒããªããžããªã§ã.envã³ããããå±éºãªçç±
- å®éã®ã»ãã¥ãªãã£äºæ äºäŸãšå¯ŸåŠæ³
- dotenv-cliã䜿ã£ãå®å šãªç°å¢åãæ¿ãææ³
- git-secretsãpre-commitããã¯ã«ããèªåã»ãã¥ãªãã£ãã§ãã¯
- AWS Secrets ManagerãDopplerãªã©ã®é«åºŠãªã·ãŒã¯ã¬ãã管ç
ð ç®æ¬¡ (ã¯ãªãã¯ããŠå±é)
- ããã©ã€ããŒããªã倧äžå€«ããšããå±éºãªæã蟌ã¿
- ãã©ã€ããŒããªããžããªã§ãå±éºãª3ã€ã®çç±
- å®éã®ã»ãã¥ãªãã£ãªã¹ã¯äºäŸ
- æ£ããç°å¢å€æ°ç®¡çã®å®è£ æ¹æ³
- ç°å¢å¥ç®¡çã®å®è£ äŸ
- ã¯ã©ãŠããã©ãããã©ãŒã ã§ã®ç°å¢å€æ°ç®¡ç
- ã»ãã¥ãªãã£ã匷åããããŒã«ã®æŽ»çš
- ããŒã éçºã§ã®éçšãããŒ
- ãã§ãã¯ãªã¹ãïŒç°å¢å€æ°ç®¡çã®ãã¹ããã©ã¯ãã£ã¹
- ãã.envãã³ãããããŠããŸã£ãå Žåã®å¯ŸåŠæ³
- ãŸãšãïŒã»ãã¥ãªãã£ãã¡ãŒã¹ãã®éçºæåã
ð€ ããã©ã€ããŒããªã倧äžå€«ããšããå±éºãªæã蟌ã¿
å€ãã®éçºè ãããã©ã€ããŒããªããžããªãªãå®å šã ããã.envãã¡ã€ã«ãã³ãããããŠãåé¡ãªãããšèããŠããŸããããããããã¯éåžžã«å±éºãªæã蟌ã¿ã§ãã
å®éã«ç§ãé¢ãã£ããããžã§ã¯ãã§ãã以äžã®ãããªäºäŸããããŸããïŒ
- ã¹ã¿ãŒãã¢ããã§ããŒã ãæ¥æ¡å€§ããäºæããªã人ããªããžããªã«ã¢ã¯ã»ã¹
- å€éšã³ã³ãµã«ã¿ã³ãã«äžæçã«ã¢ã¯ã»ã¹æš©ãä»äžãããããã®åŸãå±¥æŽã«APIããŒãæ®å
- çµç¹ã®è²·åã«ãããäºæããªãé¢ä¿è ãã³ãŒãããŒã¹ã«ã¢ã¯ã»ã¹
ð« ãã©ã€ããŒããªããžããªã§ãå±éºãª3ã€ã®çç±
1. ã¢ã¯ã»ã¹æš©éã®å€åã¯äºæž¬äžå¯èœ ð
ãããžã§ã¯ãã®æé·ãšãšãã«ãã¢ã¯ã»ã¹æš©éã¯å¿ ãå€åããŸãïŒ
2. Gitå±¥æŽã®æ°žç¶æ§åé¡ ð°ïž
äžåºŠã³ããããããæ å ±ã¯ãGitå±¥æŽã«æ°žç¶çã«æ®ããŸãïŒ
# å±éºïŒ.envãã¡ã€ã«ãã³ãããããŠããŸã£ãäŸ
git add .env
git commit -m "ç°å¢èšå®è¿œå "
git push origin main
# åŸããåé€ããŠã...
git rm .env
git commit -m ".envãã¡ã€ã«åé€"
# â å±¥æŽã«ã¯æ®ãç¶ããïŒ
éèŠ: .env
ãã¡ã€ã«ãäžåºŠã§ãã³ããããããšãgit log
ãgit show
ã³ãã³ãã§éå»ã®å±¥æŽããã·ãŒã¯ã¬ããæ
å ±ãé²èЧã§ããŠããŸããŸãã
3. 人çãã¹ã®ãªã¹ã¯ ð°
éçºçŸå Žã§ã¯ã以äžã®ãããªäººçãã¹ãé »ç¹ã«çºçããŸãïŒ
- ãã£ãããªããžããªãå ¬éèšå®ã«å€æŽ
- ééã£ããªããžããªã«ããã·ã¥
- ãã©ãŒã¯å ã§ã®èšå®ãã¹
ð å®éã®ã»ãã¥ãªãã£ãªã¹ã¯äºäŸ
ç§ãå®éã«ééããããŸãã¯æ¥çã§å ±åãããŠããäºäŸãã玹ä»ããŸãïŒ
Case 1: APIæéã®äžæ£å©çš ðž
// æŒæŽ©ãã.envãã¡ã€ã«
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxxxxx
AWS_ACCESS_KEY_ID=AKIAxxxxxxxxxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxx
çµæïŒæé¡$50ã®äºå®ããäžæ£å©çšã«ãã$15,000ã®è«æ±ãçºç
Case 2: ããŒã¿ããŒã¹ãžã®äžæ£ã¢ã¯ã»ã¹ ðïž
# æŒæŽ©ããæ¥ç¶æ
å ±
DATABASE_URL=postgresql://user:password@production-db.example.com:5432/maindb
çµæïŒé¡§å®¢ããŒã¿10äžä»¶ãå€éšã«æŒæŽ©ãGDPRéåã§å€é¡ã®å¶è£é
çŸå®ã®ãªã¹ã¯: ãããã¯æ¶ç©ºã®äºäŸã§ã¯ãããŸãããå®éã«GitHubãGitLabã§ã¹ãã£ã³ãããšã倧éã®APIããŒãDBèªèšŒæ å ±ãçºèŠãããŠããŸãã
â æ£ããç°å¢å€æ°ç®¡çã®å®è£ æ¹æ³
Step 1: .gitignoreã®é©åãªèšå®
ãŸãã¯åºæ¬ãšãªã.gitignoreãã¡ã€ã«ãèšå®ããŸãïŒ
# .gitignore
.env
.env.local
.env.development
.env.staging
.env.production
.env.*.local
# Node.js
node_modules/
npm-debug.log*
# Next.js
.next/
out/
# ãã®ä»ã®ç°å¢åºæãã¡ã€ã«
.DS_Store
Thumbs.db
Step 2: .env.exampleãã¡ã€ã«ã®äœæ
ããŒã ã¡ã³ããŒãå¿ èŠãªç°å¢å€æ°ãææ¡ã§ããããããã³ãã¬ãŒããã¡ã€ã«ãäœæããŸãïŒ
.env.example ãã¡ã€ã«ã®äœæäŸ
# .env.example
# ===========================================
# ç°å¢å€æ°èšå®ãã³ãã¬ãŒã
# ãã®ãã¡ã€ã«ãã³ããŒããŠ.envãã¡ã€ã«ãäœæããŠãã ãã
# ===========================================
# ã¢ããªã±ãŒã·ã§ã³èšå®
NEXT_PUBLIC_APP_NAME=MyApp
NEXT_PUBLIC_APP_URL=http://localhost:3000
NODE_ENV=development
# ããŒã¿ããŒã¹èšå®
DATABASE_URL=postgresql://username:password@localhost:5432/myapp
# å€éšAPIèšå®
OPENAI_API_KEY=sk-proj-your_openai_api_key_here
GOOGLE_CLIENT_ID=your_google_client_id_here
GOOGLE_CLIENT_SECRET=your_google_client_secret_here
# AWSèšå®
AWS_ACCESS_KEY_ID=your_aws_access_key_here
AWS_SECRET_ACCESS_KEY=your_aws_secret_key_here
AWS_REGION=ap-northeast-1
# ã¡ãŒã«èšå®
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=your_smtp_user_here
SMTP_PASS=your_smtp_password_here
# èªèšŒèšå®
JWT_SECRET=your_jwt_secret_here
NEXTAUTH_SECRET=your_nextauth_secret_here
NEXTAUTH_URL=http://localhost:3000
# ãã®ä»
ENCRYPTION_KEY=your_32_character_encryption_key_here
Step 3: ããŒã åãã»ããã¢ããã¹ã¯ãªãã
æ°ã¡ã³ããŒã®ãªã³ããŒãã£ã³ã°ãå¹çåããã¹ã¯ãªãããäœæããŸãã
setup.sh - ç°å¢ã»ããã¢ããã¹ã¯ãªãã
#!/bin/bash
# setup.sh - ãããžã§ã¯ãç°å¢ã»ããã¢ããã¹ã¯ãªãã
echo "ð ãããžã§ã¯ãç°å¢ãã»ããã¢ããäž..."
# .envãã¡ã€ã«ã®ååšç¢ºèª
if [ ! -f .env ]; then
echo "ð .envãã¡ã€ã«ãèŠã€ãããŸããããã³ãã¬ãŒãããã³ããŒããŸã..."
cp .env.example .env
echo "â
.envãã¡ã€ã«ãäœæããŸãã"
echo "â ïž .envãã¡ã€ã«ã«å®éã®å€ãèšå®ããŠãã ãã"
else
echo "â
.envãã¡ã€ã«ãæ¢ã«ååšããŸã"
fi
# Node.jsã®äŸåé¢ä¿ã€ã³ã¹ããŒã«
echo "ðŠ äŸåé¢ä¿ãã€ã³ã¹ããŒã«äž..."
npm install
# gitignoreã®ç¢ºèª
if grep -q ".env" .gitignore; then
echo "â
.gitignoreã«.envãå«ãŸããŠããŸã"
else
echo "â ïž .gitignoreã«.envã远å ããããšãæšå¥šããŸã"
fi
echo "ð ã»ããã¢ããå®äºïŒ"
echo "ð¡ æ¬¡ã«è¡ãããšïŒ"
echo " 1. .envãã¡ã€ã«ã«å®éã®å€ãèšå®"
echo " 2. npm run dev ã§ã¢ããªã±ãŒã·ã§ã³ãèµ·å"
ð ïž ç°å¢å¥ç®¡çã®å®è£ äŸ
å®éã®ãããžã§ã¯ãã§ã¯ãè€æ°ã®ç°å¢ïŒéçºã»ã¹ããŒãžã³ã°ã»æ¬çªïŒã管çããå¿ èŠããããŸãã
package.jsonã§ã®ç°å¢åãæ¿ãïŒããå®å šãªæ¹æ³ïŒ
ããããæ¹æ³ãšããŠcp .env.development .env
ã®ããã«ãã¡ã€ã«ãã³ããŒããæ¹æ³ããããŸããããã®æ¹æ³ã¯.env
ãã¡ã€ã«ãçŽæ¥äžæžããããããæäœãã¹ãèµ·ããå¯èœæ§ããããŸãã
ããã§ãdotenv-cli
ãcross-env
ãšãã£ãããŒã«ã䜿ããã³ãã³ãå®è¡æã®ã¿ç°å¢å€æ°ãèªã¿èŸŒãŸãããããå®å
šãªæ¹æ³ãæšå¥šããŸãã
ãŸããããŒã«ãã€ã³ã¹ããŒã«ããŸãïŒ
npm install --save-dev dotenv-cli
次ã«ãpackage.json
ã®scripts
ã以äžã®ããã«èšå®ããŸãã
{
"scripts": {
"dev": "dotenv -e .env.development -- next dev",
"build:staging": "dotenv -e .env.staging -- next build",
"start:staging": "dotenv -e .env.staging -- next start",
"build:production": "dotenv -e .env.production -- next build",
"start:production": "dotenv -e .env.production -- next start",
"setup": "./scripts/setup.sh",
"check-env": "node ./scripts/check-env.js"
}
}
ãã®æ¹æ³ã§ã¯ãã«ãŒãã®.env
ãã¡ã€ã«ã¯äžèŠã«ãªããåç°å¢çšã®ãã¡ã€ã«ïŒ.env.development
ãªã©ïŒãçŽæ¥åç
§ãããŸããããã«ãããæå³ããªããã¡ã€ã«ã®äžæžããé²ããå®å
šæ§ãåäžããŸãã
ç°å¢å€æ°æ€èšŒã¹ã¯ãªãã
check-env.js - ç°å¢å€æ°æ€èšŒã¹ã¯ãªãã
ãã®ã¹ã¯ãªããã¯dotenv
ããã±ãŒãžã«äŸåããŸããå®è¡åã«ã€ã³ã¹ããŒã«ããŠãã ããã
npm install --save-dev dotenv
// scripts/check-env.js
// ã¹ã¯ãªããã®å
é ã§dotenvãèªã¿èŸŒã¿ã.envãã¡ã€ã«ããç°å¢å€æ°ãããŒã
require('dotenv').config();
const requiredEnvVars = [
'DATABASE_URL',
'NEXTAUTH_SECRET',
'OPENAI_API_KEY',
'AWS_ACCESS_KEY_ID',
'AWS_SECRET_ACCESS_KEY'
];
const missingVars = requiredEnvVars.filter(varName => !process.env[varName]);
if (missingVars.length > 0) {
console.error('â 以äžã®ç°å¢å€æ°ãèšå®ãããŠããŸãã:');
missingVars.forEach(varName => {
console.error(` - ${varName}`);
});
console.error('\nð¡ .envãã¡ã€ã«ã確èªããå¿
èŠãªå€ãèšå®ããŠãã ãã');
process.exit(1);
}
console.log('â
å
šãŠã®å¿
èŠãªç°å¢å€æ°ãèšå®ãããŠããŸã');
// ã»ãã¥ãªãã£ãã§ãã¯
const sensitiveVars = ['JWT_SECRET', 'NEXTAUTH_SECRET', 'ENCRYPTION_KEY'];
sensitiveVars.forEach(varName => {
const value = process.env[varName];
if (value && value.length < 32) {
console.warn(`â ïž ${varName} ã¯32æå以äžã«ããããšãæšå¥šããŸã`);
}
});
ãã®ã¹ã¯ãªãããç¹å®ã®ç°å¢ãã¡ã€ã«ïŒäŸïŒ.env.staging
ïŒã«å¯ŸããŠå®è¡ãããå Žåã¯ãpackage.json
ã§ä»¥äžã®ããã«èšå®ããŸãã
"check-env:staging": "dotenv -e .env.staging -- node ./scripts/check-env.js"
ð ã¯ã©ãŠããã©ãããã©ãŒã ã§ã®ç°å¢å€æ°ç®¡ç
Vercelã§ã®ç°å¢å€æ°èšå®
Vercelã䜿çšããŠããå Žåã®æšå¥šèšå®æ¹æ³ïŒ
# Vercel CLIã䜿çšããç°å¢å€æ°èšå®
vercel env add DATABASE_URL production
vercel env add OPENAI_API_KEY production
# ç°å¢å€æ°ã®äžèŠ§è¡šç€º
vercel env ls
# ããŒã«ã«ã«ç°å¢å€æ°ããã«
vercel env pull .env.local
Next.jsã§ã®ç°å¢å€æ°ã®äœ¿ãåã
// Next.jsã§ã®ç°å¢å€æ°ã®é©åãªäœ¿çšäŸ
// â
ãµãŒããŒãµã€ãã§ã®ã¿äœ¿çšïŒç§å¿æ
å ±ïŒ
const openaiApiKey = process.env.OPENAI_API_KEY;
// â
ã¯ã©ã€ã¢ã³ããµã€ãã§ã䜿çšå¯èœïŒå
¬éæ
å ±ïŒ
const appUrl = process.env.NEXT_PUBLIC_APP_URL;
// â ééã£ãäŸïŒç§å¿æ
å ±ãNEXT_PUBLIC_ã§å
Ž
// const dbUrl = process.env.NEXT_PUBLIC_DATABASE_URL; // å±éºïŒ
Next.jsã®ç°å¢å€æ°ã«ãŒã«: NEXT_PUBLIC_
ãã¬ãã£ãã¯ã¹ãä»ããç°å¢å€æ°ã®ã¿ãã¯ã©ã€ã¢ã³ããµã€ãã§å©çšå¯èœã«ãªããŸããããŒã¿ããŒã¹URLãAPIããŒãªã©ã®ç§å¿æ
å ±ã«ã¯çµ¶å¯Ÿã«äœ¿çšããªãã§ãã ããã
ð ã»ãã¥ãªãã£ã匷åããããŒã«ã®æŽ»çš
1. git-secretsã«ããèªåæ€åº
æ©å¯æ å ±ã®ã³ããããé²ãããã®ããŒã«ïŒ
# git-secretsã®ã€ã³ã¹ããŒã«
brew install git-secrets
# ãããžã§ã¯ãã§ã®èšå®
git secrets --install
git secrets --register-aws
# ã«ã¹ã¿ã ãã¿ãŒã³ã®è¿œå
git secrets --add 'sk-[a-zA-Z0-9]{48}' # OpenAI APIããŒ
git secrets --add 'AIza[0-9A-Za-z\\-_]{35}' # Google APIããŒ
2. pre-commitããã¯ã®èšå®
.pre-commit-config.yaml - pre-commitããã¯èšå®
# .pre-commit-config.yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
hooks:
- id: check-added-large-files
- id: check-json
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/Yelp/detect-secrets
rev: v1.4.0
hooks:
- id: detect-secrets
args: ['--baseline', '.secrets.baseline']
exclude: package.lock.json
- repo: local
hooks:
- id: check-env-files
name: Check for .env files
entry: bash -c 'if git diff --cached --name-only | grep -E "\.env$|\.env\..*$"; then echo "â .envãã¡ã€ã«ãã³ãããããããšããŠããŸãïŒ"; exit 1; fi'
language: system
pass_filenames: false
ð¥ ããŒã éçºã§ã®éçšãããŒ
ããŒã éçºã§ã¯ã以äžã®ãããŒã§ç°å¢å€æ°ã管çããŠããŸãïŒ
å®å šãªå ±ææ¹æ³ã®äŸ
- LastPassãBitwardenã䜿çš
# LastPass CLIã䜿çšããå
±æäŸ
lpass share create "ProjectName-Secrets" teammate@company.com
lpass add --note "ProjectName/.env" < .env
- æå·åãã¡ã€ã«ã§ã®å ±æ
# GPGã䜿çšããæå·å
gpg --armor --encrypt --recipient teammate@company.com .env
# â .env.asc ãã¡ã€ã«ãçæãããïŒãããSlackãªã©ã§å
±æïŒ
-
äžæçãªå®å
šãªå
±æãµãŒãã¹
- privnote.com - äžåºŠèªããšæ¶ãã
- onetimesecret.com - ã¯ã³ã¿ã€ã ã·ãŒã¯ã¬ãã
âš ããã«é²ãã æ¹æ³ïŒã·ãŒã¯ã¬ãã管çãµãŒãã¹ã®æŽ»çš
å€§èŠæš¡ãªãããžã§ã¯ãããããé«åºŠãªã»ãã¥ãªãã£èŠä»¶ãæ±ããããå Žåã¯ãå°çšã®ã·ãŒã¯ã¬ãã管çãµãŒãã¹ãå©çšããã®ããã¹ããã©ã¯ãã£ã¹ã§ãã
- AWS Secrets Manager: AWSãµãŒãã¹ãšã·ãŒã ã¬ã¹ã«é£æºãã·ãŒã¯ã¬ããã®èªåããŒããŒã·ã§ã³æ©èœã匷åã
- Google Secret Manager: Google Cloud Platform (GCP) ã§ã®å©çšã«æé©ãIAMãšé£æºãã现ããæš©é管çãå¯èœã
- HashiCorp Vault: ã¯ã©ãŠãã«äŸåããªããªãŒãã³ãœãŒã¹ã®ããŒã«ãéåžžã«é«æ©èœã§ãå€ãã®ãã©ãããã©ãŒã ã«å¯Ÿå¿ã
- Doppler: éçºè äœéšã«åªããŠãããè€æ°ã®ç°å¢ããããžã§ã¯ãã®ã·ãŒã¯ã¬ãããçŽæçã«åæã»ç®¡çã§ããã
ãããã®ãµãŒãã¹ã¯ãã·ãŒã¯ã¬ããã®äžå 管çãå³å¯ãªã¢ã¯ã»ã¹å¶åŸ¡ãç£æ»ãã°ãèªåããŒããŒã·ã§ã³ãšãã£ãæ©èœãæäŸããçµç¹å šäœã®ã»ãã¥ãªãã£ã¬ãã«ãé£èºçã«åäžãããŸãã
ð ãã§ãã¯ãªã¹ãïŒç°å¢å€æ°ç®¡çã®ãã¹ããã©ã¯ãã£ã¹
ãããžã§ã¯ãéå§æã«å¿ ã確èªãã¹ãé ç®ïŒ
åºæ¬é ç®ïŒ
-
.env
ç³»ã®ãã¡ã€ã«ã.gitignore
ã«å«ãŸããŠãã -
.env.example
ãã¡ã€ã«ãäœæã»ç¶æãããŠãã - ããŒã å ã§å®å šãªå ±ææ¹æ³ã確ç«ãããŠãã
æšå¥šé ç®ïŒ
-
git-secrets
ãŸãã¯é¡äŒŒããŒã«ãèšå®ãããŠãã - pre-commitããã¯ãåäœããŠãã
- ç°å¢å€æ°æ€èšŒã¹ã¯ãªãããå®è£ ãããŠãã
-
dotenv-cli
ãªã©ãå©çšããå®å šã«ç°å¢ãåãæ¿ããŠãã - ã¯ã©ãŠããã©ãããã©ãŒã ã§ã®ç°å¢å€æ°ç®¡çãèšå®ãããŠãã
é«åºŠãªé ç®ïŒ
- 宿çãªã·ãŒã¯ã¬ããããŒããŒã·ã§ã³ãèšç»ãããŠãã
- å€§èŠæš¡ãããžã§ã¯ãã®å Žåãã·ãŒã¯ã¬ãã管çãµãŒãã¹ã®å©çšãæ€èšããŠãã
ðš ãã.envãã³ãããããŠããŸã£ãå Žåã®å¯ŸåŠæ³
äžãäžãæ©å¯æ å ±ãã³ãããããŠããŸã£ãå Žåã®ç·æ¥å¯ŸåŠæé ïŒ
1. å³åº§ã«èªèšŒæ å ±ãç¡å¹å
# 1. APIããŒã®ç¡å¹åïŒåãµãŒãã¹ã®ããã·ã¥ããŒãã§å®è¡ïŒ
# 2. ããŒã¿ããŒã¹ãã¹ã¯ãŒãã®å€æŽ
# 3. æ°ããèªèšŒæ
å ±ã®çæ
2. Gitå±¥æŽããã®å®å šåé€
# git filter-branchã䜿çšããå±¥æŽã®æžãæã
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch .env' \
--prune-empty --tag-name-filter cat -- --all
# ãªã¢ãŒãã«åŒ·å¶ããã·ã¥ïŒããŒã å
šäœã«åœ±é¿ããããæ³šæïŒ
git push origin --force --all
git push origin --force --tags
éèŠ: å±¥æŽã®æžãæãã¯ããŒã å šäœã«åœ±é¿ããŸããäºåã«ããŒã ã¡ã³ããŒã«éç¥ããå šå¡ãããŒã«ã«ãªããžããªãåé€ããŠåã¯ããŒã³ããå¿ èŠããããŸãã
ð¡ ãŸãšãïŒã»ãã¥ãªãã£ãã¡ãŒã¹ãã®éçºæåã
ç°å¢å€æ°ç®¡çã¯ãåãªãæè¡çãªåé¡ã§ã¯ãªããããŒã å šäœã®ã»ãã¥ãªãã£æèãåæ ããææšã§ãã
ãã©ã€ããŒããªããžããªã§ãã.envãã¡ã€ã«ã¯ã³ãããããªãããšããååãå®ãããšã§ãé·æçãªã»ãã¥ãªãã£ãªã¹ã¯ãåé¿ããå°æ¥ã®çµç¹å€æŽã«ãèãããå ç¢ãªã·ã¹ãã ãæ§ç¯ã§ããŸããç§èªèº«ãçŸå Žã§æ°å€ãã®ãããžã§ã¯ãã«é¢ãã£ãŠããŸããããã»ãã¥ãªãã£äºæ ã®å€ãã¯ãåºæ¬çãªã«ãŒã«ã®è»œèŠãããå§ãŸããŸãã
ä»å玹ä»ããdotenv-cli
ã®ãããªã¢ãã³ãªããŒã«ããå¿
èŠã«å¿ããã·ãŒã¯ã¬ãã管çãµãŒãã¹ã掻çšããããšã§ãé¢åãªäœæ¥ãèªååããå¹çæ§ãšã»ãã¥ãªãã£ãäž¡ç«ã§ããŸããæ°ãããããžã§ã¯ããå§ããéã¯ããã²ãã®èšäºãåèã«ãã»ãã¥ã¢ãªç°å¢å€æ°ç®¡çãå®è£
ããŠãã ããð¡ïž
æåŸã«ïŒæ¥åå§èšã®ãçžè«ãæ¿ããŸã
ç§ã¯æ¥åå§èšãšã³ãžãã¢ãšããŠWEBå¶äœãã·ã¹ãã éçºãè«ãè² ã£ãŠããŸããææ°æè¡ã掻çšããã¬ã¹ãã³ã·ããªWebãµã€ãå¶äœãã€ã³ã¿ã©ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³éçºãAPI飿ºãªã©å¹ åºããèŠæã«å¯Ÿå¿å¯èœã§ãã
ã課é¡è§£æ±ºã«åãã峿Šåãæ¬²ããããé«å質ãªWebå¶äœãäŸé Œãããããšããæ¹ã¯ããæ°è»œã«ãçžè«ãã ãããäžç·ã«ããžãã¹ã®æé·ãç®æããŸãããïŒ