2015-08-17 37 views
5

Przenoszę starszą aplikację do Elastic Beanstalk. Potrzebuje trwałego przechowywania (na razie). Chcę zamontować wolumin EBS.Montowanie woluminu EBS (nie migawki) do Elastic Beanstalk EC2

miałem nadzieję, że będzie działać w następujący .ebextensions/ebs.config:

commands: 
    01mkdir: 
    command: "mkdir /data" 
    02mount: 
    command: "mount /dev/sdh /data" 

option_settings: 
    - namespace: aws:autoscaling:launchconfiguration 
    option_name: BlockDeviceMappings 
    value: /dev/sdh=vol-XXXXX 

https://blogs.aws.amazon.com/application-management/post/Tx224DU59IG3OR9/Customize-Ephemeral-and-EBS-Volumes-in-Elastic-Beanstalk-Environments

Ale niestety pojawia się następujący błąd „(vol-XXXX) dla parametru snapshotId Oczekiwany jest nieważna.„Snap- ... "."

Oczywiście ta metoda pozwala tylko na migawki. Czy ktoś może zaproponować poprawkę lub alternatywną metodę?

Odpowiedz

7

Znalazłem rozwiązanie. Można go poprawić, usuwając "uśpienie 10", ale niestety jest to wymagane, ponieważ aws ec2 attach-volume jest asynchroniczne i zwraca się natychmiast, zanim nastąpi załącznik.

container_commands: 
    01mount: 
    command: "aws ec2 attach-volume --volume-id vol-XXXXXX --instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) --device /dev/sdh" 
    ignoreErrors: true 
    02wait: 
    command: "sleep 10" 
    03mkdir: 
    command: "mkdir /data" 
    test: "[ ! -d /data ]" 
    04mount: 
    command: "mount /dev/sdh /data" 
    test: "! mountpoint -q /dev/sdh" 

Uwaga. Idealnie byłoby uruchomić w commands sekcji nie container_commands, ale zmienne środowiskowe nie są ustawione w czasie.

+0

Zamiast 'ignoreErrors' można' testu: "[! -b/dev/SDH]" '. – Dan

+0

Nie rozumiem twojej notatki: jakie zmienne środowiskowe? Gdyby to było w 'commands' zamiast' container_commands', czy nie musiałbyś restartować kontenera docker tak, jak to było w @hashinclude? –

2

Aby dodać do @ odpowiedź Simona (aby uniknąć pułapki na nieostrożnych):

  • Jeżeli trwałe składowanie jest zamontowana zostanie ostatecznie wykorzystane wewnątrz kontenera Docker (np jeśli używasz Jenkins i chcą persist jenkins_home), musisz uruchomić ponownie kontener dokera po uruchomieniu mount.
  • Wymagane jest, aby akcja "ec2: AttachVolumes" była dozwolona zarówno dla instancji EC2 (lub instancji/* ARN), jak i woluminu (-ów), które chcesz dołączyć (lub wolumenu/* ARN) w założonym EB polityka rola. Bez tego komenda aws ec2 attach-volume kończy się niepowodzeniem.
  • Trzeba zdać w --region dowodzić aws ec2 ..., jak również (co najmniej, jak to pisze)
0

Tu jest z brakującym config:

commands: 
    01mount: 
    command: "export AWS_ACCESS_KEY_ID=<replace by your AWS key> && export AWS_SECRET_ACCESS_KEY=<replace by your AWS secret> && aws ec2 attach-volume --volume-id <replace by you volume id> --instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) --device /dev/xvdf --region <replace with your region>" 
    ignoreErrors: true 
    02wait: 
    command: "sleep 10" 
    03mkdir: 
    command: "mkdir /home/lucene" 
    test: "[ ! -d /home/lucene ]" 
    04mount: 
    command: "mount /dev/xvdf /home/lucene" 
    test: "! mountpoint -q /dev/xvdf"