AWS codededededede配備では、\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


本明細書では、AWS CodeDeployの実施手順については説明しない.
学校は「黒石計画」を開始し、サーバーの起動と自動配置パイプのために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で作成できます.
簡単な機能は次のとおりです.
  • キー-値を
  • として保存します.
  • は、鍵管理サービスを使用して暗号化値
  • を記憶することができる.
  • IAMは、一部のユーザが
  • にアクセスできるようにする.
  • の値を保存する変更履歴
  • 背中がある.

    パラメータストアの登録



    名前、タイプ、値を設定するだけで、簡単にパラメータを登録できます.
    ここで、名前(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
  • パラメータのプレフィックスを設定できます.
  • 接頭辞は、スラッシュ(/)で始まる必要があります.
  • default :/config
  • defaultContextすべてのサービスで共有されるプロパティのコンテキスト名を定義します.
  • default : application
  • profileSeparator
  • 以上の環境にセパレータを使用して配置できます.
  • profileは、spring.config.activate.on-profileプロパティで設定された値を使用します.
  • profileが存在しない場合は使用しません.
  • 点(.)、dash(-)、前スラッシュ(/)、後スラッシュ(\)、下線(_)のみ使用できます.
  • default : underscore( _ )
  • failFast
  • パラメータが読めない場合、どのように操作するかを決定します.
  • trueでは、アプリケーションの実行は許可されていません.
  • default : true
  • name
  • パラメータの識別子アプリケーション名.
  • パラメータを適用するアプリケーションを指定できます.
  • 値が指定されていない場合は、spring.application.name属性値を参照してください.
  • ビット属性さえ存在しない場合は、デフォルト値が使用されます.
  • default : application
  • enabled
  • Parameter Storeを使用するかどうかを選択します.
  • default : true
  • 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の記事にほぼ近い
    しかし、私が経験した面倒な解決過程を経験した人もいると思います.
    この文章を読んで、解決策を探すのに役立つことを望んでいます.

    リファレンス

  • 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