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

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

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

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

Q&A

解決済

2回答

1474閲覧

circleciで環境変数が読まれない。ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access

joru

総合スコア45

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

0グッド

1クリップ

投稿2019/05/17 02:37

編集2019/05/17 04:54

前提・実現したいこと

docker-composeを用いたcircle ciをセットアップしています。
方法としては
『project settings』 ⇨ 『environment variables』 ⇨ 『add variables』
の順で
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
を設定しました。
そして、

yml

1#.circleci/config.yml 2 - run: echo ${ENV} > ~/.env

で、読み込んでいます。

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

#!/bin/bash -eo pipefail docker-compose run web rails db:create db:migrate Starting project_db_1 ... rails aborted! ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key /usr/local/bundle/gems/fog-core-1.45.0/lib/fog/core/service.rb:244:in `validate_options' /usr/local/bundle/gems/fog-core-1.45.0/lib/fog/core/service.rb:268:in `handle_settings'

該当のソースコード

yml

1#.circleci/config.yml 2 3version: 2 4jobs: 5 build: 6 machine: 7 image: circleci/classic:edge 8 steps: 9 - checkout 10 - run: echo ${ENV} > ~/.env 11 - run: 12 name: docker-compose build 13 command: docker-compose build 14 - run: 15 name: docker-compose up 16 command: docker-compose up -d 17 - run: 18 name: sleep for waiting launch db 19 command: sleep 1 20 - run: 21 name: "before_test: setup db" 22 command: docker-compose run web rails db:create db:migrate 23 - run: 24 name: test

yml

1#docker-compose.yml 2 3version: '3' 4services: 5 db: 6 image: mysql:5.7 7 environment: 8 MYSQL_ROOT_PASSWORD: rootpassword 9 MYSQL_DATABASE: root 10 ports: 11 - "3306:3306" 12 13 web: 14 build: . 15 command: bundle exec rails s -p 3000 -b '0.0.0.0' 16 volumes: 17 - .:/app_name 18 ports: 19 - "3000:3000" 20 links: 21 - db

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

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

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

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

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

suama

2019/05/17 04:39

CircleCIの中でdocker-composeを使うのですね。 docker-compose.yml の中には、``env_file: .env`` は指定されていますでしょうか? あと、CircleCIのワーキングディレクトリは ~/ ではなくて ~/project/ になるので、その辺りなのかな?とも思っています。 差し支えなければdocker-compose.yml も出していただけますでしょうか。
joru

2019/05/17 04:54

こちら、追記させていただきました。
suama

2019/05/17 07:31

ありがとうございます!
guest

回答2

0

ベストアンサー

こんばんは。追記のお願いも含めましてありがとうございます。
CircleCIの設定で環境変数として設定されているかと思いますが、まず、iwamotさまの書かれているとおり、echo ${ENV} ではおそらくなにも出力されていないと思います。

また、この環境変数を、CircleCIのコンテナではなくて、docker-composeで起動しているRailsアプリケーション側に渡したい、ということでよろしいでしょうか。

(1) CircleCIのコンテナのrunコマンドで .env ファイルに環境変数を書き出す

- run: echo ${ENV} > ~/.env ではなく、

- run: env > ~/.env

もしくは

- run: command: | echo AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} > ~/.env echo AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} >> ~/.env

としてCircleCIのコンテナ上の環境変数を .env ファイルに書き出してあげれば良いと思います。
ただし、- run: env > ~/.env だと、不要な環境変数もまざると思いますのでご注意を。(CIRCLECI_XXXX といった環境変数など)

**確認方法: **

CircleCIはビルド(task)がうまくいかない時の調査用に、sshコマンドでコンテナの中にアクセスできるようになっています。
想定した値が .env に書かれているかどうか、この方法を使うと良いと思います。


(2) .env の値をdocker-composeで起動しているRailsアプリケーション側に渡す

そのままだと、docker-composeで起動しているRailsアプリケーション側には、この環境変数が渡らないかもしれません。(うまく行っていたらスルーしてください)

(1) だけでうまくいかなかったら、docker-compose.yml のサービス:web のところに、env_fileとして .env を渡してあげてみてください。

web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/app_name env_file: - ~/.env ports: - "3000:3000" links: - db

追記:docker-composeで起動している側のチェック

CircleCIのコンテナ内にsshで入れた場合、次に、docker-compose で起動するRails用のコンテナで環境変数がうまく渡っているかを確認すると良いかもしれません。

こちらを実行した時に、AWS用の環境変数も出力されているとうまく渡っていると思いますが、もしなにも入っていないようなら、.env をRails側に渡せていないかもしれません。

bash

1docker-compose run web rails runner 'ENV.keys.each { |key| puts "#{key}=#{ENV[key]}" }'

投稿2019/05/17 14:42

編集2019/05/19 00:33
suama

総合スコア1997

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

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

joru

2019/05/18 08:53

ご丁寧にありがとうございます。 ``` command: | echo AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} > ~/.env echo AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} >> ~/.env ``` Debugging with SSH こちらの方法でcat .envしてみたら ``` $cat .env AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= ``` となっていて、環境変数は設定されているようです。 ですが、 ``` #!/bin/bash -eo pipefail docker-compose run web rails db:create db:migrate Starting project_db_1 ... rails aborted! TypeError: no implicit conversion of nil into String /usr/local/bundle/gems/rack-cors-1.0.3/lib/rack/cors.rb:282:in `quote' /usr/local/bundle/gems/rack-cors-1.0.3/lib/rack/cors.rb:282:in `block in origins' /usr/local/bundle/gems/rack-cors-1.0.3/lib/rack/cors.rb:275:in `map' /usr/local/bundle/gems/rack-cors-1.0.3/lib/rack/cors.rb:275:in `origins' ``` 新しいエラーが出ました。。。
suama

2019/05/19 00:28 編集

こんにちは。 SSHでCircleCI側に入ってくださってありがとうございます。 ``$cat .env`` の結果は実際はキーが書かれているという状態でよろしいでしょうか? (ブランクだと何かおかしいですので、AWS_ACCESS_KEY_ID=xxxxとなっている想定です) CircleCIのコンテナの中ではOKであれば、次にdocker-compose で起動しているrails用のコンテナ内に、この環境変数が引きつがれているかをチェックしてみては如何でしょうか。 ``` bundle exec rails runner 'ENV.keys.each { |key| puts "#{key}=#{ENV[key]}" }' ``` でRailsから認識される環境変数が出力できるので、docker-compose 経由なら、 ``` docker-compose run web rails runner 'ENV.keys.each { |key| puts "#{key}=#{ENV[key]}" }' ``` で出てくると思います。 ここでAWS用のキーがうまく出ていればOKなのかなと思っています。 Markdownがコメント欄だとうまく表現できなさそうなので、回答側に追記してみますね。
guest

0

${ENV}だと、ENVという名前の環境変数を見に行ってしまうのではないでしょうか。${AWS_ACCESS_KEY_ID}${AWS_SECRET_ACCESS_KEY}のように参照するのが正しいのではないかと思います。ぼくの勘違いであればすみません。

投稿2019/05/17 10:42

iwamot

総合スコア1154

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問