AWS codededededede配備では、\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
14163 ワード
本明細書では、AWS CodeDeployの実施手順については説明しない.
学校は「黒石計画」を開始し、サーバーの起動と自動配置パイプのためにGithub Actions+AWS CodeDeployを使用した.
どちらも無料で、資源の使用量も多くなく、私にとっては良い選択でした.
問題は、CodeDeployの導入中に発生しました.
デプロイされたshell scriptを実行すると、アプリケーションは正常に動作し、自動デプロイ中にアプリケーションは実行できません.
何が問題なのか分からないので、ログファイルを作成してアプリケーションをチェックしました.ymlファイルにログインする環境変数を入力できません.
それほど注目すべき項目ではありませんが、念のため
したがって、自分でデプロイメント・スクリプトを実行すると、正常に動作しますが、デプロイメント中は正常に動作しません.
dockerを使用する場合は、コンテナを移動するときに注入を受け入れるために変数をコンビネーションファイルに入れます(もちろん、これは良い方法ではありません).導入中に注入する必要があります.
したがって、デプロイ後に実行するスクリプトをサーバに保存できます(変数を共通の場所に隠すことができます).CodeDeployのhookを実行時にファイルを実行させますが、動作しません.
原因を調べたところ、CodeDeployはhookを実行している間に、
例えば、このような方法で
したがって、このように
そして,環境変数をどのように注入するかを再び探る.
方法。
キー-値を として保存します.は、鍵管理サービスを使用して暗号化値 を記憶することができる. IAMは、一部のユーザが にアクセスできるようにする.の値を保存する変更履歴 背中がある.
名前、タイプ、値を設定するだけで、簡単にパラメータを登録できます.
ここで、名前(
重要なデータについては、セキュリティ文字列(
セキュリティ文字列を使用する場合、Parameter Storeは課金されませんが、AWS鍵管理サービス暗号化を使用すると課金されます.
登録パラメータでは名前は変更できません.値のみ変更できます.を参照してください.
パラメータを登録した場合、どのように使用しますか?
フレームごとに違いますが、私は今プロジェクトでSpringBootを使っているので、SpringBootの使い方を知りました.△他のフレームワークにも資料があります.
使用したバージョンはSpringBoot 2.6.5、Gradle 7.4です.
Spring Cloud Dependencyを持っていないので、個別に追加しました.
Spring Bootへの依存性が追加された場合は、yamlファイルを設定する必要があります.
また、下部に
パラメータのプレフィックスを設定できます. 接頭辞は、スラッシュ( default :/config default : application 以上の環境にセパレータを使用して配置できます. profileは、 profileが存在しない場合は使用しません. 点( default : underscore( パラメータが読めない場合、どのように操作するかを決定します. trueでは、アプリケーションの実行は許可されていません. default : true パラメータの識別子アプリケーション名. パラメータを適用するアプリケーションを指定できます. 値が指定されていない場合は、 ビット属性さえ存在しない場合は、デフォルト値が使用されます. default : application Parameter Storeを使用するかどうかを選択します. default : true
yamlファイルの設定が完了している場合は、Parameter Storeにアクセスする権限を登録する必要があります.
既存のEC 2 IAMロールに
IAMを登録して再配置すると、アプリケーションは正常に動作します.の最後の部分
https://godngu.github.io/aws/codedeploy-envrionment-variable https://docs.awspring.io/spring-cloud-aws/docs/2.3.0/reference/html/index.html#integrating-your-spring-cloud-application-with-the-aws-parameter-store
学校は「黒石計画」を開始し、サーバーの起動と自動配置パイプのためにGithub Actions+AWS CodeDeployを使用した.
どちらも無料で、資源の使用量も多くなく、私にとっては良い選択でした.
問題は、CodeDeployの導入中に発生しました.
デプロイされたshell scriptを実行すると、アプリケーションは正常に動作し、自動デプロイ中にアプリケーションは実行できません.
何が問題なのか分からないので、ログファイルを作成してアプリケーションをチェックしました.ymlファイルにログインする環境変数を入力できません.
# deploy.log
java.lang.RuntimeException: Driver com.mysql.cj.jdbc.Driver claims to not accept jdbcUrl, ${DATABASE_URL}
at com.zaxxer.hikari.util.DriverDataSource.<init>(DriverDataSource.java:110) ~[HikariCP-4.0.3.jar!/:na]
at com.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:331) ~[HikariCP-4.0.3.jar!/:na]
at com.zaxxer.hikari.pool.PoolBase.<init>(PoolBase.java:114) ~[HikariCP-4.0.3.jar!/:na]
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:108) ~[HikariCP-4.0.3.jar!/:na]
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar!/:na]
...
開発サーバが使用するデータベースurl、ユーザー名、パスワードをすべて公開すると、悪意のあるユーザーはデータベースを任意に操作できるため、環境変数として処理します.それほど注目すべき項目ではありませんが、念のため
# application.yml
spring:
config:
activate:
on-profile: dev
datasource:
url: ${DATABASE_URL}
username: ${DATABASE_USERNAME}
password: ${DATABASE_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
これにより、開発サーバに環境変数が登録されますが、CodeDeployは導入中にこれらの変数を注入しませんでした.したがって、自分でデプロイメント・スクリプトを実行すると、正常に動作しますが、デプロイメント中は正常に動作しません.
dockerを使用する場合は、コンテナを移動するときに注入を受け入れるために変数をコンビネーションファイルに入れます(もちろん、これは良い方法ではありません).導入中に注入する必要があります.
したがって、デプロイ後に実行するスクリプトをサーバに保存できます(変数を共通の場所に隠すことができます).CodeDeployのhookを実行時にファイルを実行させますが、動作しません.
原因を調べたところ、CodeDeployはhookを実行している間に、
배포 ID
という名前のディレクトリ内のdeployment-archive
ディレクトリをlocationとして、そのディレクトリ内でファイルを検索していることがわかりました.例えば、このような方法で
/opt/codedeploy-agent/deployment-root/9820b37d-a865-482e-b3d2-9f54ef466ab3/d-3D2Z6JP2G/deployment-archive
また、locationプロパティの絶対パスも役に立たないようです.したがって、このように
appspec.yml
ファイルを記述すると、ScriptMissing
エラーが発生します.# appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app
hooks:
ApplicationStart:
- location: /home/ubuntu/deploy.sh
timeout: 60
# ScriptMissing Error
Script does not exist at specified location: /opt/codedeploy-agent/deployment-root/9820b37d-a865-482e-b3d2-9f54ef466ab3/d-3D2Z6JP2G/deployment-archive/home/ubuntu/deploy.sh
そのため、プロジェクトディレクトリに配置スクリプトを作成して、配置時に同じディレクトリに配置する必要があります.(他に方法はあるかもしれませんが、これが私の限界です…)そして,環境変数をどのように注入するかを再び探る.
方法。
これは私がグーグルに努力している間に見つけたもので、/etc/profile.d
でCodeDeploy用のShellスクリプトを作成すれば、CodeDeployは環境変数を読み取ることができます.# /etc/profile.d/codedeploy.sh
export DATABASE_URL=
export DATABASE_USERNAME=
export DATABASE_PASSWORD=
しかし、捨てられたのかもしれませんが、私は正常に働いていません.△確かに昔の文章です.
方法。
次の方法はAWSのParameter Store
を利用する方法です.
Parameter Storeについて簡単に説明しましょう
パラメータストアバー
Parameter StoreはAWSサービスで、外部から機密データを注入し、無料で利用できます.
Parameter StoreはAWS System Manager → Parameter Store
で作成できます.
簡単な機能は次のとおりです.
# /etc/profile.d/codedeploy.sh
export DATABASE_URL=
export DATABASE_USERNAME=
export DATABASE_PASSWORD=
次の方法はAWSの
Parameter Store
を利用する方法です.Parameter Storeについて簡単に説明しましょう
パラメータストアバー
Parameter StoreはAWSサービスで、外部から機密データを注入し、無料で利用できます.
Parameter Storeは
AWS System Manager → Parameter Store
で作成できます.簡単な機能は次のとおりです.
パラメータストアの登録
名前、タイプ、値を設定するだけで、簡単にパラメータを登録できます.
ここで、名前(
Name
)は、スラッシュ(/
)の階層を使用します.ex) /config/zooneon_dev/DATABASE_PASSWORD
階層構造を必ずしも使用する必要はありませんが、パラメータ管理が便利であるなどの理由から、この方法を推奨します.重要なデータについては、セキュリティ文字列(
SecureString
)を使用して暗号化値を格納することができる.セキュリティ文字列を使用する場合、Parameter Storeは課金されませんが、AWS鍵管理サービス暗号化を使用すると課金されます.
登録パラメータでは名前は変更できません.値のみ変更できます.を参照してください.
パラメータストアの使用
パラメータを登録した場合、どのように使用しますか?
フレームごとに違いますが、私は今プロジェクトでSpringBootを使っているので、SpringBootの使い方を知りました.△他のフレームワークにも資料があります.
使用したバージョンはSpringBoot 2.6.5、Gradle 7.4です.
依存関係の設定
Spring Cloud Dependencyを持っていないので、個別に追加しました.
dependencyManagement {
imports {
mavenBom 'io.awspring.cloud:spring-cloud-aws-dependencies:2.3.3'
}
}
次に、dependencyにspring-cloud-starter-aws-parameter-store-config
を追加すればよい.dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//...
//parameter store
implementation 'io.awspring.cloud:spring-cloud-starter-aws-parameter-store-config'
}
yamlファイル設定
Spring Bootへの依存性が追加された場合は、yamlファイルを設定する必要があります.
# application.yml
spring:
config:
activate:
on-profile: dev
# aws-parameterstore: 추가
import: 'aws-parameterstore:'
datasource:
url: ${DATABASE_URL}
username: ${DATABASE_USERNAME}
password: ${DATABASE_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
# 불러올 파라미터 설정
aws:
paramstore:
name: docswant
既存のyamlファイルでは、spring.config.import
プロパティを使用してaws-parameterstore:
を追加し、パラメータを自動的にロードします.また、下部に
aws.paramstore
プロパティを使用して、ロードするパラメータを設定することもできます.aws.paramstoreプロパティ
prefix
/
)で始まる必要があります.defaultContext
すべてのサービスで共有されるプロパティのコンテキスト名を定義します. profileSeparator
spring.config.activate.on-profile
プロパティで設定された値を使用します..
)、dash(-
)、前スラッシュ(/
)、後スラッシュ(\
)、下線(_
)のみ使用できます._
) failFast
name
spring.application.name
属性値を参照してください.enabled
IAMロールの登録
yamlファイルの設定が完了している場合は、Parameter Storeにアクセスする権限を登録する必要があります.
既存のEC 2 IAMロールに
AmazonSSMReadOnlyAccess
権限を追加します.IAMを登録して再配置すると、アプリケーションは正常に動作します.
# deploy.log
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.5)
...
...
...
2022-04-11 09:36:45.514 INFO 819 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will not secure any request
2022-04-11 09:36:46.536 INFO 819 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-04-11 09:36:46.564 INFO 819 --- [ main] s.capstone.docswant.DocswantApplication : Started DocswantApplication in 12.712 seconds (JVM running for 14.137)
の最後の部分
Parameter Storeの記事にほぼ近い
しかし、私が経験した面倒な解決過程を経験した人もいると思います.
この文章を読んで、解決策を探すのに役立つことを望んでいます.
リファレンス
Reference
この問題について(AWS codededededede配備では、\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\), 我々は、より多くの情報をここで見つけました https://velog.io/@zooneon/AWS-CodeDeploy-environment-variablesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol