質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%

Q&A

解決済

1回答

523閲覧

circleciの仮想マシンからEC2にSSH接続した場合、EC2のOSの環境変数が受け取れない

deango

総合スコア161

0グッド

0クリップ

投稿2022/10/16 04:21

前提

djangodでWEBアプリを作成しています。
自動デプロイの設定をcircleciで試しておりますが、
circleciの仮想マシンからEC2にSSH接続した場合、EC2のOSの環境変数が受け取れず困っています。
原因わからず、お力添えいただけますと幸いです。

実現したいこと

circleciの仮想マシンからEC2にSSH接続した後、EC2のOSの環境変数が受け取りたい

発生している問題・エラーメッセージ

pipenv run python3 /home/**/app//*/manage.py migrateでSECRET_KEYが読み込めずエラーになっています。

+ ssh ***********@************ ' cd ~/app/***** && git pull origin master && python3 -m pip install --upgrade pip && python3 -m pipenv install --skip-lock && cd ~/app/*****/***** && pipenv run python3 /home/***********/app/*****/*****/manage.py migrate && pipenv run python3 /home/***********/app/*****/*****/manage.py collectstatic --noinput && pipenv run sudo systemctl reload nginx.service && pipenv run pkill gunicorn && pipenv run gunicorn --bind 127.0.0.1:8000 *****_pj.wsgi -D && pipenv run ps -aux | grep gunicorn ' Warning: Permanently added '************' (ED25519) to the list of known hosts. From https://github.com/keydean130/***** * branch master -> FETCH_HEAD 60fbb8e..9903910 master -> origin/master Merge made by the 'ort' strategy. .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) Defaulting to user installation because normal site-packages is not writeable Requirement already satisfied: pip in /home/***********/.local/lib/python3.7/site-packages (22.3) Installing dependencies from Pipfile... To activate this project's virtualenv, run pipenv shell. Alternatively, run a command inside the virtualenv with pipenv run. Traceback (most recent call last): File "/home/***********/app/*****/*****/manage.py", line 22, in <module> main() File "/home/***********/app/*****/*****/manage.py", line 18, in main execute_from_command_line(sys.argv) File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line utility.execute() File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/core/management/__init__.py", line 395, in execute django.setup() File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/apps/registry.py", line 122, in populate app_config.ready() File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/contrib/admin/apps.py", line 27, in ready self.module.autodiscover() File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/contrib/admin/__init__.py", line 24, in autodiscover autodiscover_modules('admin', register_to=site) File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/utils/module_loading.py", line 47, in autodiscover_modules import_module('%s.%s' % (app_config.name, module_to_search)) File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib64/python3.7/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1006, in _gcd_import File "<frozen importlib._bootstrap>", line 983, in _find_and_load File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 677, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 728, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/contrib/auth/admin.py", line 6, in <module> from django.contrib.auth.forms import ( File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/contrib/auth/forms.py", line 11, in <module> from django.contrib.auth.tokens import default_token_generator File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/contrib/auth/tokens.py", line 117, in <module> default_token_generator = PasswordResetTokenGenerator() File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/contrib/auth/tokens.py", line 18, in __init__ self.secret = self.secret or settings.SECRET_KEY File "/home/***********/.local/share/virtualenvs/*****-COasu-hY/lib/python3.7/site-packages/django/conf/__init__.py", line 90, in __getattr__ raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.") django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty. + aws ec2 revoke-security-group-ingress --group-id sg-0dd95220d0b64b53a --protocol tcp --port 22 --cidr 54.147.101.198/32 { "Return": true } Exited with code exit status 1 CircleCI received exit code 1

該当のソースコード

circleci/config.yml

1# circleCIのバージョン指定 2version: 2.1 3jobs: 4 # Djangoのテストを実行 5 build: 6 ~略~ 7 8 # EC2にSSH接続し、デプロイを実行する 9 deploy: 10 machine: 11 image: ubuntu-2204:2022.04.2 12 steps: 13 - checkout 14 # CircleCIに登録した秘密鍵を呼び出す。 15 - add_ssh_keys: 16 fingerprints: 17 - ${KEY_FINGERPRINT} 18 - run: sudo pip install awscli 19 - run: 20 name: ec2 deploy 21 command: | 22 set -ex 23 24 export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} 25 export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} 26 export AWS_DEFAULT_REGION="us-west-2" 27 28 MY_SECURITY_GROUP="sg-0dd95220d0b64b53a" 29 MY_IP=`curl -f -s ifconfig.me` 30 31 trap "aws ec2 revoke-security-group-ingress --group-id $MY_SECURITY_GROUP --protocol tcp --port 22 --cidr $MY_IP/32" 0 1 2 3 15 32 aws ec2 authorize-security-group-ingress --group-id $MY_SECURITY_GROUP --protocol tcp --port 22 --cidr $MY_IP/32 33 ssh ${USER_NAME}@${HOST_NAME} ' 34 cd ~/app/nyapu && 35 git pull origin master && 36 python3 -m pip install --upgrade pip && 37 python3 -m pipenv install --skip-lock && 38 cd ~/app/nyapu/nyapu && 39 pipenv run python3 /home/nyapu_admin/app/nyapu/nyapu/manage.py migrate && 40 pipenv run python3 /home/nyapu_admin/app/nyapu/nyapu/manage.py collectstatic --noinput && 41 pipenv run sudo systemctl reload nginx.service && 42 pipenv run pkill gunicorn && 43 pipenv run gunicorn --bind 127.0.0.1:8000 nyapu_pj.wsgi -D && 44 pipenv run ps -aux | grep gunicorn 45 ' 46 47# テストが成功した場合のみ、deployを実行する。 48workflows: 49 version: 2.1 50 build_and_deploy: 51 jobs: 52 - build 53 - deploy: 54 requires: 55 - build 56 # masterブランチがpushされた場合のみdeployするようにする。 57 filters: 58 branches: 59 only: master 60

SECRET_KEYは以下のようにOSの環境変数を読み込んでおり、ユーザの~/.bash_profileに環境変数設定しています。

settings_common.py

1import os 2from django.contrib.messages import constants as messages 3 4SECRET_KEY = os.environ.get('SECRET_KEY') 5 6~略~

試したこと

circleciを使用せず、${USER_NAME}と同じユーザでEC2にssh接続して、
同じコマンド実行した場合は、正常に環境変数を読み取れます。

補足情報(FW/ツールのバージョンなど)

Python 3.7
Django 3.2.14
CircleCI 2.1
Amazon Linux2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

bashの仕様で、sshした直後に環境変数が読み込めていないのが原因でした。

ssh ${USER_NAME}@${HOST_NAME} '
source ~./bash_profile
~コマンド~
'
とすることで正常に環境変数読み込めるようになりました。

参考にしたサイトは以下です。
https://nobwak.github.io/posts/2013-07-25-freebsdlinux_ssh%E7%B5%8C%E7%94%B1%E3%81%A7%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%AA%AD%E3%81%BE%E3%81%AA%E3%81%84%E3%81%A7%E3%81%94%E3%81%96%E3%82%8B/

投稿2022/10/23 06:37

deango

総合スコア161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問